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

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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-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/。

希望这会有所帮助!

【讨论】:

我在子表单中这样做, $form->getData() 返回一个空数组。我的表单类型有字段,但它仍然有效。 编辑:好的,使用$form-&gt;getData() 是我的错误,我必须搜索正确的字段:$form-&gt;get('aField')-&gt;getData()

以上是关于基于 Symfony2 中其他字段值的字段条件验证的主要内容,如果未能解决你的问题,请参考以下文章

SQL:基于另一个字段值的条件字段输出

基于字段值的“有条件”加入?

php WPForms:基于字段值的条件表单重定向。

Symfony2 Form + AngularJS for REST API = 表单验证额外字段错误

Symfony2 生成带有选项的实体字段

基于其他字段的 Mongoose 验证 [重复]