基于Symfony2中的其他字段值对字段进行条件验证

时间:2015-05-13 06:04:43

标签: php symfony symfony-forms symfony-validator

所以这是场景:我有一个单选按钮组。根据它们的价值,我应该或不应该验证其他三个字段(它们是空白的,它们是否包含数字等)。

我可以以某种方式将所有这些值传递给约束,并在那里进行比较吗?

或者直接在控制器中回调是解决此问题的更好方法吗?

一般来说,这种情况下的最佳做法是什么?

2 个答案:

答案 0 :(得分:7)

我建议您使用callback validator

例如,在您的实体类中:

<?php

use Symfony\Component\Validator\Constraints as Assert;

/**
 * @Assert\Callback(methods={"myValidation"})
 */
class Setting {
    public function myValidation(ExecutionContextInterface $context)
    {
        if (
                $this->getRadioSelection() == '1' // RADIO SELECT EXAMPLE
                &&
                ( // CHECK OTHER PARAMS
                 $this->getFiled1() == null
                )
            )
        {
            $context->addViolation('mandatory params');
        }
       // put some other validation rule here
    }
}

否则,您可以按照here所述构建自己的自定义验证程序。

请告诉我您需要更多信息。

希望这有帮助。

答案 1 :(得分:5)

您需要使用验证组。这允许您仅针对该类的某些约束验证对象。可以在Symfony2文档http://symfony.com/doc/current/book/validation.html#validation-groups以及http://symfony.com/doc/current/book/forms.html#validation-groups

中找到更多信息

在表单中,您可以定义一个名为setDefaultOptions的方法,该方法应如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    // some other code here ...
    $builder->add('SOME_FIELD', 'password', array(
        'constraints' => array(
            new NotBlank(array(
                'message' => 'Password is required',
                'groups' => array('SOME_OTHER_VALIDATION_GROUP'),
            )),
        )
   ))
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => function (FormInterface $form) {
            $groups = array('Default');
            $data = $form->getData();

            if ($data['SOME_OTHER_FIELD']) { // then we want password to be required
                $groups[] = 'SOME_OTHER_VALIDATION_GROUP';
            }

            return $groups;
        }
    ));
}

以下链接提供了如何使用它们的详细示例http://web.archive.org/web/20161119202935/http://marcjuch.li:80/blog/2013/04/21/how-to-use-validation-groups-in-symfony/

希望这有帮助!