You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:57:04