Symfony表单两次使用villes字段渲染时报错该如何解决
报错原因
- 控制器中为表单重复添加了两个同名
villes字段,Symfony表单要求所有字段标识唯一,重复添加的字段会被覆盖,且同一个表单字段不允许重复渲染 - 绑定的
$vol实体没有分别存储出发城市、到达城市的独立字段,单个villes字段无法承载两个下拉选项的值
修复步骤
1. 修改Vol实体类
删除原有的villes字段,新增两个分别对应出发、到达城市的关联字段,示例代码如下:
// src/Entity/Vol.php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity */ class Vol { // 其他原有字段... /** * @ORM\ManyToOne(targetEntity: Ville::class) * @ORM\JoinColumn(nullable: false) */ private $villeDepart; /** * @ORM\ManyToOne(targetEntity: Ville::class) * @ORM\JoinColumn(nullable: false) */ private $villeArrivee; // 生成对应的getter、setter方法 public function getVilleDepart(): ?Ville { return $this->villeDepart; } public function setVilleDepart(?Ville $villeDepart): self { $this->villeDepart = $villeDepart; return $this; } public function getVilleArrivee(): ?Ville { return $this->villeArrivee; } public function setVilleArrivee(?Ville $villeArrivee): self { $this->villeArrivee = $villeArrivee; return $this; } }
2. 修改控制器表单构建代码
替换原来的两个villes字段为上面新增的两个独立字段,指定字段类型为EntityType关联Ville表:
// 先导入需要的类 use Symfony\Bridge\Doctrine\Form\Type\EntityType; use App\Entity\Ville; // 表单构建部分修改为如下代码 $form = $this->createFormBuilder($vol) ->add('hor_dep') // 出发城市字段,对应实体的villeDepart属性 ->add('villeDepart', EntityType::class, [ 'class' => Ville::class, 'choice_label' => 'nom', // 替换为Ville表中要显示的实际字段名,比如城市名称 'label' => 'Ville de départ' ]) // 到达城市字段,对应实体的villeArrivee属性 ->add('villeArrivee', EntityType::class, [ 'class' => Ville::class, 'choice_label' => 'nom', 'label' => "Ville d'arrivée" ]) ->add('hor_arrivee') // 模板中用到了该字段,原表单漏加此处补充 ->add('prix') ->add('reduc', CheckboxType::class, array('required' => true, 'label' => 'Réduction')) ->add('nbr_place') ->getForm();
3. 修改twig渲染模板
把原来重复渲染villes字段的部分替换为两个独立字段的渲染代码:
<div class="col-lg-6"> {{ form_label(form.hor_dep,'Heure de départ') }} {{ form_widget(form.hor_dep) }} {{ form_row(form.villeDepart) }} {{ form_label(form.hor_arrivee,"Heure d'arrivée") }} {{ form_widget(form.hor_arrivee) }} {{ form_row(form.villeArrivee) }} </div> <div class="col-lg-6"> {{ form_label(form.prix,'Prix') }} {{ form_widget(form.prix) }} {{ form_label(form.reduc,'possède une réduction ?') }} {{ form_widget(form.reduc) }} {{ form_label(form.nbr_place,'Nombre de place') }} {{ form_widget(form.nbr_place) }} </div> {{ form_rest(form) }}
修改完成后更新数据库表结构即可正常使用。
内容的提问来源于stack exchange,提问作者Ubik Bic
相关产品推荐
相关产品推荐

