我需要根据提交的数据实施表单验证。虽然数据对象的invoice
属性为true,但validation_groups
数组不仅应包含'add'验证,还应包含'company'。
我在Symfony Docs https://github.com/symfony/symfony-docs/blob/master/book/forms.rst中找到了“基于提交数据的群组”一章。
问题在于:
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Strict\PublicBundle\Entity\Booking',
'validation_groups' => function(FormInterface $form)
{
return array('booking');
},
);
}
抛出此错误:
警告:/var/www/vendor/symfony/src/Symfony/Component/Validator/GraphWalker.php第101行中的非法偏移类型 500内部服务器错误 - ErrorException
任何想法可能出错?
答案 0 :(得分:3)
根据this pull request使用validation_groups
的回调将在Symfony 2.1(尚未发布,目前master
分支)中可用。
您确定使用的是主分支吗?如果您使用的是当前稳定版(2.0.x),它不支持基于提交数据的组,则必须仅使用数组。请参阅http://symfony.com/doc/current/book/forms.html#book-forms-validation-groups上的相应文档。
答案 1 :(得分:2)
我有另一种选择:如果您能够在绑定表单之前确定条件,则可以在创建表单时简单地覆盖默认的验证组列表。
在我的情况下,我在会话中有一个订单对象,可以跨多个表单页面进行更新。 订单可以是“交货”或“取货”,如果在前一个屏幕上选择了交货,我需要在此屏幕上验证地址详细信息:
if ($order->getOrderType() == "Delivery")
{
$validationGroups = array('step3', 'delivery');
}
else
{
$validationGroups = array('step3');
}
$formType = new Form\Order3Type();
$form = $this->createForm($formType, $order, array("validation_groups" => $validationGroups));
$form->bindRequest($request);
如果你的情况在表格中但尚未在会话中,你可以随时直接从请求对象中提取值。
答案 2 :(得分:1)
// MyFormType.php
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'Strict\PublicBundle\Entity\Booking',
'validation_groups' => function (FormInterface $form) {
$data = $form->getData();
$groups = ['booking'];
if ($data->invoice) {
$groups[] = 'company';
}
return $groups;
},
]);
}