Symfony Doctrine OneToOne embedded form error_bubbling



我正在尝试获取嵌入表单的错误消息,以显示在有错误的表单字段旁边。

我有 2 个与一对一关系相关的教义实体,如下所示:

class Contact
{
    /**
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id
    /**
     * @ORMOneToOne(targetEntity="Name", mappedBy="contact", cascade={"persist"})
     */
    protected $name;
}
class Name
{
    /**
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id
    /**
     * @var string $givenName
     *
     * @ORMColumn(type="string", name="given_name", length=255)
     * @AssertNotBlank(
     *     message="Given name must not be blank."
     * )
     * @AssertLength(
     *     min="2",
     *     max="255",
     *     minMessage="Given name is too short.",
     *     maxMessage="Given name is too long."
     * )
     */
    protected $givenName;
}

我创建了 2 个窗体,一个用于联系人实体,一个用于名称实体。然后,我将"名称"窗体嵌入到"联系人"窗体中。

class ContactType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', new NameType());
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'         => AcmeCoreBundleEntityContact,
            'cascade_validation' => true,
            'error_bubbling'     => false,
        ));
    }
    public function getName()
    {
        return 'acme_contact';
    }
}
class NameType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('given_name', 'text', array(
                'required'       => true,
                'error_bubbling' => false,
            ));
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'     => AcmeCoreBundleEntityName,
            'error_bubbling' => false,
        ));
    }
    public function getName()
    {
        return 'acme_name';
    }
}

我已将cascade_validation设置为"联系人"窗体(根窗体)上的trueerror_bubbling设置为在所有级别false。我已经测试了这些配置选项,并且正在设置它们。

但是,错误消息被附加到form.name而不是form.name.given_name,这就是我想要的。

我哪里出错了?

马修

解决了!

对于遇到类似问题的任何人来说,问题在于表单字段的命名。

在我的实体中,该属性使用 camelCase 命名,如下所示:

protected $givenName;

但是,在我的表单中,我使用下划线表示法命名该字段,因为我相信这是约定。

$builder->add('given_name', 'text');

这适用于除错误冒泡之外的所有内容。简单的解决方案是重命名我的字段,如下所示:

$builder->add('givenName', 'text');

我希望这对某人有所帮助:)

您根本不需要将error_bubbling设置为 false 或 true。首先尝试删除所有将error_bubbling设置为 false 的行。

此外,请尝试将'validation_groups' => array('yourValidationGroup')添加到这两种类型,然后更新验证文件以引用yourValidationGroup

然后,也许作为最后一次尝试,将提交按钮添加到联系人类型,以确保联系人类型是要提交的联系人类型。

class ContactType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', new NameType());
        $builder->add('save', 'submit'));
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'         => AcmeCoreBundleEntityContact,
            'cascade_validation' => true,
            'validation_groups' => array('yourValidationGroup'),
        ));
    }
    public function getName()
    {
        return 'acme_contact';
    }
}
class NameType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('given_name', 'text', array(
                'required'       => true,
            ));
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'     => AcmeCoreBundleEntityName,
            'validation_groups' => array('yourValidationGroup'),
        ));
    }
    public function getName()
    {
        return 'acme_name';
    }
}     

编辑:我还想到,您可能依赖于注释来进行验证,而不是在您的捆绑包中使用 validation.yml 文件?(即.../Resources/config/validation.yml)

相关内容

  • 没有找到相关文章