Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于Symfony2中其他字段值的字段条件验证_Php_Symfony_Symfony Forms_Symfony Validator - Fatal编程技术网

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

Php 基于Symfony2中其他字段值的字段条件验证,php,symfony,symfony-forms,symfony-validator,Php,Symfony,Symfony Forms,Symfony Validator,下面是一个场景:我有一个单选按钮组。根据它们的值,我应该或不应该验证其他三个字段(它们是否为空,是否包含数字等) 我可以将所有这些值以某种方式传递给约束,并在那里进行比较吗 或者直接在控制器中回调是解决此问题的更好方法 一般来说,这种情况下的最佳做法是什么?您需要使用验证组。这允许您仅根据该类上的某些约束验证对象。更多信息请参见Symfony2文档,以及 在表单中,您可以定义一个名为setDefaultOptions的方法,该方法应如下所示: public function buildForm(

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

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

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


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

您需要使用验证组。这允许您仅根据该类上的某些约束验证对象。更多信息请参见Symfony2文档,以及

在表单中,您可以定义一个名为
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;
        }
    ));
}
下面的链接提供了如何使用它们的详细示例

希望这有帮助

我建议你使用一种新的方法

例如,在实体类中:

<?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
    }
}

不完全是我需要的,但它引导我找到了正确的解决方案。非常感谢。您好@spiridon,您能否详细说明如何基于此方法实现正确的解决方案?谢谢,我正在子表单中执行此操作,$form->getData()返回一个空数组。我的表单类型有字段,但不可用。编辑:好的,使用
$Form->getData()
是我的错误,我必须搜索正确的字段:
$Form->get('aField')->getData()