【问题标题】:Conditionally required in Zend Framework's 2 InputFilterZend Framework 的 2 InputFilter 有条件需要
【发布时间】:2012-11-17 17:37:25
【问题描述】:

我正在使用 Zend Framework 2 制作应用程序。我正在使用 InputFilter 验证输入。是否有可能有条件地要求一些Inputs?我的意思是我有这样的代码:

$filter = new \Zend\InputFilter\InputFilter();
$factory = new \Zend\InputFilter\Factory();
$filter->add($factory->createInput(array(
    'name' => 'type',
    'required' => true
)));
$filter->add($factory->createInput(array(
    'name' => 'smth',
    'required' => true
)));

我希望字段 something 是必需的,仅当 type 等于 1 时。有没有内置的方法可以做到这一点?还是我应该只创建自定义验证器?

【问题讨论】:

    标签: php zend-framework2 zend-form


    【解决方案1】:

    首先,您可能希望从 Empty values passed to Zend framework 2 validators 开始对空/空值启用验证

    您可以使用回调输入过滤器,如下例所示:

    $filter = new \Zend\InputFilter\InputFilter();
    $type   = new \Zend\InputFilter\Input('type');
    $smth   = new \Zend\InputFilter\Input('smth');
    
    $smth
        ->getValidatorChain()
        ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL))
        ->attach(new \Zend\Validator\Callback(function ($value) use ($type) {
            return $value || (1 != $type->getValue());
        }));
    
    $filter->add($type);
    $filter->add($smth);
    

    smth 的值为空字符串且type 的值不是1 时,这基本上可以工作。如果type 的值为1,则smth 必须不同于空字符串。

    【讨论】:

    • 请注意,由于 PHP 检查接口的方式非常松散,因此也可以使用 isValid($value, array $context = []) 方法定义验证器。这样,$context 可用于根据上下文启用/禁用验证。
    【解决方案2】:

    我无法让 Ocramius 的示例正常工作,因为 $type->getValue 始终为 NULL。我稍微更改了代码以使用 $context,这对我有用:

    $filter = new \Zend\InputFilter\InputFilter();
    $type   = new \Zend\InputFilter\Input('type');
    $smth   = new \Zend\InputFilter\Input('smth');
    
    $smth
        ->getValidatorChain()
        ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL))
        ->attach(new \Zend\Validator\Callback(function ($value, $context){
            return $value || (1 != $context['type']);
        }));
    
    $filter->add($type);
    $filter->add($smth);
    

    【讨论】:

      【解决方案3】:

      您也可以为此使用setValidationGroup

      创建您自己的InputFilter 类,您可以根据在执行实际验证之前在输入过滤器中设置的数据设置验证组。

      class MyInputFilter extends InputFilter
      {
         setData($data){
             if(isset($data['type']) && $data['type'] === 1){
                 // if we have type in data and value equals 1 we validate all fields including something
                 setValidationGroup(InputFilterInterface::VALIDATE_ALL);
             }else{
                 // in all other cases we only validate type field
                 setValidationGroup(['type']);
             }
             parent::setData($data);
         }
      }
      

      这只是一个简单的示例来展示setValidatioGroup 的可能性,您可以创建自己的组合来根据您的特定需求设置验证组。

      【讨论】:

        【解决方案4】:

        不幸的是,您必须根据自己的条件设置所需的选项,如下所示:

        $filter->add($factory->createInput(array(
            'name' => 'smth',
            'required' => (isset($_POST['type']) && $_POST['type'] == '1'),
        )));
        

        【讨论】:

        • 这是错误的。您在此根据必须过滤的请求设置有关过滤器的值:它在概念上是错误的。
        猜你喜欢
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多