在 symfony 2 中将验证组设置为嵌入表单
Posted
技术标签:
【中文标题】在 symfony 2 中将验证组设置为嵌入表单【英文标题】:set validation group to embedded forms in symfony 2 【发布时间】:2013-09-15 09:13:18 【问题描述】:如何在嵌入式表单中设置验证组? 我有两个实体 A 和 B 以及每个实体的表单(FormA,FormB) 我将 FormA 嵌入 FormB 中
class FormB extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
$builder->add('A', new FormA());
public function setDefaultOptions(OptionsResolverInterface $resolver)
$resolver->setDefaults(array(
'data_class' => 'Acme\TestBundle\Entity\B',
'validation_groups'=>function(FormInterface $form)
// set validation group for FormA here
,
'cascade_validation'=>true
));
FormB如何设置FormA的验证组?
【问题讨论】:
【参考方案1】:对我有用
class FormB extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
$builder->add('A', new FormA(), array('validation_groups' => array('yourValidationGroup')));
public function setDefaultOptions(OptionsResolverInterface $resolver)
$resolver->setDefaults(array(
'data_class' => 'Acme\TestBundle\Entity\B',
'cascade_validation'=>true
));
还可以在 FormB->setDefaultOptions 中定义验证组。它将验证组应用于所有子表单。
public function setDefaultOptions(OptionsResolverInterface $resolver)
$resolver->setDefaults(array(
'data_class' => 'Acme\TestBundle\Entity\B',
'cascade_validation'=>true,
'validation_groups' => array('yourValidationGroup')
));
要根据基础数据使用它,您可以将该代码放在事件侦听器上:
public function buildForm(FormBuilderInterface $builder, array $options)
$builder->addEventListener(
FormEvents::POST_SET_DATA,
function(FormEvent $event)
$form=$event->getForm();
/**
* @var ContactDetail $detail
*/
$entity=$form->getData();
if($entity->getA()->isRequired())
$form->add('A', new FormA(), array('validation_groups' => array('yourValidationGroup')));
else
$form->add('A', new FormA(), array());
);
【讨论】:
我希望在关闭验证组时这样做,因为我需要根据某些表单元素值添加验证组 我添加了一个示例,该示例使用 EventListeners 根据基础数据添加组验证。 我正在尝试$builder->add('A', new FormA(), array('validation_groups' => array('yourValidationGroup')));
,但对我不起作用...但是将validation_groups 放入默认选项有效...您知道为什么第一次尝试不起作用吗?【参考方案2】:
属性cascade_validation
是deprecated in Symfony 2.8,将在 Symfony 3.0 中删除。要使用cascade_validation
,您应该使用@Assert\Valid
constraint。
class Profile
/**
* @var Address
*
* @Assert\Valid()
*/
private $address;
附:注意:链接提供给 Symfony 2.8 版本。
【讨论】:
以上是关于在 symfony 2 中将验证组设置为嵌入表单的主要内容,如果未能解决你的问题,请参考以下文章