Validation ZF2是否仅基于另一个元素生成所需的表单元素?

Validation ZF2是否仅基于另一个元素生成所需的表单元素?,validation,zend-framework2,zend-form2,Validation,Zend Framework2,Zend Form2,因此,我的表单中有一个元素列表,其中一个是带有简单yes/no选项的选择框。当字段为“否”时,我希望将下一个输入字段设置为必填字段 此时,我的输入过滤器看起来像: return [ [ 'name' => 'condition', 'required' => true, ], [ 'name' => 'additional', 'required' => false,

因此,我的表单中有一个元素列表,其中一个是带有简单yes/no选项的选择框。当字段为“否”时,我希望将下一个输入字段设置为必填字段

此时,我的输入过滤器看起来像:

return [
    [
        'name' => 'condition',
        'required' => true,
    ],
    [
        'name' => 'additional',
        'required' => false,
        'validators' => [
            [
                'name' => 'callback',
                'options' => [
                    'callback' => function($value, $context) {
                        //If condition is "NO", mark required
                        if($context['condition'] === '0' && strlen($value) === 0) {
                            return false;
                        }
                        return true;
                    },
                    'messages' => [
                        'callbackValue' => 'Additional details are required',
                    ],
                ],
            ],
            [
                'name' => 'string_length',
                'options' => [
                    'max' => 255,
                    'messages' => [
                        'stringLengthTooLong' => 'The input must be less than or equal to %max% characters long',
                    ],
                ],
            ],
        ],
    ],
];
我的发现是因为我有
'required'=>false,
对于
附加
字段,没有一个
验证器运行


只有当
条件
为“否”(值“0”)时,我如何使
附加
成为必需项?

可以从
getInputFilterSpecification
函数中检索元素。因此,可以将一个元素标记为
必需的
,也可以不基于相同表单或字段集中另一个元素的值:

'required' => $this->get('condition')->getValue() === '0',
有了这个,我也可以摆脱大量的
回调
验证器

return [
    [
        'name' => 'condition',
        'required' => true,
    ],
    [
        'name' => 'additional',
        'required' => $this->get('condition')->getValue() === '0',
        'validators' => [
            [
                'name' => 'string_length',
                'options' => [
                    'max' => 255,
                    'messages' => [
                        'stringLengthTooLong' => 'The input must be less than or equal to %max% characters long',
                    ],
                ],
            ],
        ],
    ],
];