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

Symfony扩展Bundle的FormType时报Names array contains duplicates如何解决

问题根因
  • Symfony表单渲染时会为每个表单类型按getBlockPrefix()返回值生成对应的块名称,重复的块前缀会触发你遇到的重复块报错。你自定义的OrderType继承自第三方的FormOrderType,且没有重写getBlockPrefix方法,默认生成的块前缀和父类完全一致,最终渲染时重复生成了order_errors块。
  • 你在configureOptions中强制覆盖inherit_data = false的配置不符合表单继承的常规场景,也会加剧块冲突问题。
解决方案

方案1:修复当前继承表单的配置

直接给你的OrderType添加getBlockPrefix方法,返回唯一的自定义前缀即可解决冲突,修改后代码如下:

class OrderType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'token_id',
            HiddenType::class,
            [
                'required' => false,
            ]
        );
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        // 不需要覆盖inherit_data参数,继承父类配置即可,只保留自定义配置
        $resolver->setDefaults([
            'validation_groups' => false,
        ]);
    }

    public function getParent()
    {
        return FormOrderType::class;
    }

    // 新增此方法,返回唯一前缀即可避免冲突
    public function getBlockPrefix(): string
    {
        return 'app_order';
    }
}

方案2:改用官方推荐的表单类型扩展(更适合扩展第三方Bundle表单场景)

如果你的需求只是给第三方的FormOrderType新增字段、不需要修改原有逻辑,用表单类型扩展不会产生块前缀冲突问题,实现方式如下:

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
// 替换为第三方Bundle对应的FormOrderType命名空间
use ThirdPartyBundle\Form\Type\FormOrderType;

class FormOrderTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'token_id',
            HiddenType::class,
            [
                'required' => false,
            ]
        );
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'validation_groups' => false,
        ]);
    }

    public static function getExtendedTypes(): iterable
    {
        return [FormOrderType::class];
    }
}

扩展类按Symfony规则注册后,所有使用FormOrderType的地方都会自动新增你添加的字段,无需修改原有表单调用逻辑。

内容的提问来源于stack exchange,提问作者tanjiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:36:03