Validation symfony2中的非重叠选项列表
使用Symfony 2.2.4 我有一个表单,其中有两个选项列表(多个,未展开),显示相同的元素(类的实体)。当用户从两个选择列表中选择相同的元素时,我需要抛出一个错误(onsubmit)。是否有一种方法可以验证此选择,而不需要遍历两个列表检查每个元素,就像自动/内置验证一样 我需要捕获错误并将其绑定到一个选项列表中,以允许我将其显示为任何其他错误,这意味着通过form_错误(form)Validation symfony2中的非重叠选项列表,validation,symfony,multiple-choice,Validation,Symfony,Multiple Choice,使用Symfony 2.2.4 我有一个表单,其中有两个选项列表(多个,未展开),显示相同的元素(类的实体)。当用户从两个选择列表中选择相同的元素时,我需要抛出一个错误(onsubmit)。是否有一种方法可以验证此选择,而不需要遍历两个列表检查每个元素,就像自动/内置验证一样 我需要捕获错误并将其绑定到一个选项列表中,以允许我将其显示为任何其他错误,这意味着通过form_错误(form) 任何提示都值得欣赏。最简单的方法是在AbstractType类的buildForm中添加一个侦听器,下面是一
任何提示都值得欣赏。最简单的方法是在AbstractType类的buildForm中添加一个侦听器,下面是一个示例
$builder->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$coll1 = $form['field1']->getData();
$coll2 = $form['field2']->getData();
$ids1 = $coll1->map(function($entity) { return $entity->getId(); })->toArray();
$ids2 = $coll1->map(function($entity) { return $entity->getId(); })->toArray();
$intersect = array_intersect($ids1, $ids2);
if (!empty($intersect)) {
$form['field1']->addError(
new FormError('here the error')
);
}
}
);
请注意,我没有测试集合的交叉点,但我希望其含义是明确的
另一种(有点困难)方法是创建自定义验证约束
我最终在控制器中验证了它,关于您的答案,我实际上没有尝试,但我对此有疑问:当两个数组中的元素都相等时,还是当两个数组中至少有一个元素时,它会抛出错误?因为我需要latterwell,看起来你在我写的时候改变了答案,最后我也使用了array_intersect函数,只在控制器中使用,因为我从来没有与监听器一起工作过,新手,到目前为止它是有效的,但可以肯定的是,相交实体而不是ID会有问题吗?,将来会因为某种原因出错吗?可能直接与实体相交也同样有效,但我不确定,我更信任ID:)