【问题标题】:Conditional validation of fields based on other field value in Symfony2基于 Symfony2 中其他字段值的字段条件验证
【发布时间】:2015-07-24 06:29:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php symfony symfony-forms symfony-validator


    【解决方案1】:

    我建议你使用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 的描述构建自己的自定义验证器。

    让我知道您需要更多信息。

    希望这会有所帮助。

    【讨论】:

    • 不是完全我需要的,但它引导我找到了正确的解决方案。谢谢!!
    • 嗨@spiridon,您能否详细说明您是如何根据这种方法实现正确的解决方案的?谢谢
    【解决方案2】:

    您需要使用验证组。这使您可以仅针对该类的某些约束来验证对象。更多信息可以在 Symfony2 文档中找到 http://symfony.com/doc/current/book/validation.html#validation-groupshttp://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/

    希望这会有所帮助!

    【讨论】:

    • 我在子表单中这样做, $form->getData() 返回一个空数组。我的表单类型有字段,但它仍然有效。
    • 编辑:好的,使用$form-&gt;getData() 是我的错误,我必须搜索正确的字段:$form-&gt;get('aField')-&gt;getData()
    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 2017-09-08
    • 2018-01-12
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2016-01-02
    • 2013-07-19
    相关资源
    最近更新 更多