Symfony2中的动态验证组

时间:2012-02-14 13:54:58

标签: symfony validation

我需要根据提交的数据实施表单验证。虽然数据对象的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

任何想法可能出错?

3 个答案:

答案 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;
        },
    ]);
}