Symfony 2:添加自定义表单元素,而不是在实体中

Posted

技术标签:

【中文标题】Symfony 2:添加自定义表单元素,而不是在实体中【英文标题】:Symfony 2 : Add a custom form element, not in an Entity 【发布时间】:2012-06-12 14:14:03 【问题描述】:

我使用 Symfony2,我想创建一个注册表单。 我不想使用 FOSUserBundle。

所以,我创建了一个实体帐户(包含字段:用户名、密码、电子邮件...)并创建了表单:

 $account = new Account();

$form = $this->createFormBuilder($account)
  ->add('username',         'text', array('label' => 'Nom de compte :'))
  ->add('password',    'password', array('label' => 'Mot de passe :'))
  ->add('email',            'email', array('label' => 'Adresse email :'))
  ->getForm();

现在,我想为密码添加一个确认字段。 但是,当我尝试使用 add() 方法添加字段时,例如“password_confirmation” 我有这个:

“App\FrontBundle\Entity\Account”类中不存在属性“password_confirmation”、方法“getPasswordConfirmation()”和方法“isPasswordConfirmation()”

如何添加自定义字段?之后,如何验证它?

谢谢。 BR。

【问题讨论】:

【参考方案1】:

在正常情况下,您需要使用 property_path 选项明确指定 *password_confirmation* 不是实体的一部分。

->add('password_confirmation', 'password', array('property_path' => false))

然后使用CallBackValidator 进行验证。

但是,在这种特定情况下,您想要重复一个字段,repeated 小部件可以为您完成。

->add('password_confirmation', 'repeated', array(
    // See the docs :)
));

【讨论】:

这在 Symfony 2.1 中不再有效。您应该使用 'mapped' => false 代替,例如:->add('password_confirmation', 'password', array('mapped' => false));【参考方案2】:

Symfony 2.1 的更新:

property_path 已被弃用,您应该改用mapped。语法保持不变:

->add('password_confirmation', 'password', array('mapped' => false))

【讨论】:

以上是关于Symfony 2:添加自定义表单元素,而不是在实体中的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 将自定义字段添加到表单构建器

Symfony 1.4:表单中 CSRF 的自定义错误消息

向 Symfony 2 表单元素添加错误

Symfony2 - 重载注册表单导致 CSRF 错误(添加 github repo)

Symfony 5 - 带有 TextType 的自定义 ChoiceType

Symfony2:如何对自定义复合表单类型使用约束?