Zend framework2 \Zend\Form\Element\Collection验证作为一个整体

Zend framework2 \Zend\Form\Element\Collection验证作为一个整体,zend-framework2,zend-form,Zend Framework2,Zend Form,我有收集表格。我将验证附加到整个集合中,我只想检查集合元素之间是否存在某些关系 而且效果很好。如果数据错误,表单将无法通过isValid测试 但有一个问题。formElementErrors/getMessages未返回任何内容。 我做错了什么 我的表格: class Form implements InputFilterProviderInterface { /** * @return array */ public function getInputFi

我有收集表格。我将验证附加到整个集合中,我只想检查集合元素之间是否存在某些关系

而且效果很好。如果数据错误,表单将无法通过isValid测试

但有一个问题。formElementErrors/getMessages未返回任何内容。 我做错了什么

我的表格:

class Form implements InputFilterProviderInterface {

    /**
     * @return array
     */
    public function getInputFilterSpecification()
    {

        return [
            [
                'name'       => 'legend',
                'required'   => true,
                'allowEmpty' => false,
                'validators' => [
                    ['name' => 'Callback', 'options' => [
                        'messages' => [
                            \Zend\Validator\Callback::INVALID_VALUE => 'Wrong',
                        ],
                        'callback' => function ($values, $context=[]) {
                            return false;
                        },
                    ]],
                ]
            ],


        ];
    }

    public function init()
    {
        $this->add(
            [
                'name'    => 'legend',
                'type'    => 'Zend\Form\Element\Collection',
                'options' => [
                    'label'                  => 'Legenda',
                    'count'                  => 2,
                    'should_create_template' => true,
                    'allow_add'              => true,
                    'template_placeholder'   => '__placeholder__',
                    'target_element'         => [
                        'type' => 'Narzedzie\Form\Legenda\LegendyOpcjeFieldset',
                    ],
                ],
            ]
        );
    }
}
和视图:

    $element = $NarzedzieForm->get('legend');

    var_dump($element->getMessages());  // in case of error - empty array!
    echo $this->formElementErrors($element); // in case of error -  empty string
    echo $this->formColleciton($element);

也许你需要同时添加这两条消息

'messages' => [
     \Zend\Validator\Callback::INVALID_VALUE => 'Wrong VALUE',
     \Zend\Validator\Callback::INVALID_CALLBACK => 'Wrong CALLBACK',
 ],
因为您只提供了一条回调消息,所以可能会抑制无效回调消息?我希望它能回到违约状态。但是所有这些验证器消息在我看来都有点愚蠢

看起来您的回调中有一个错误,可能是抛出了一个异常,并在try-catch语句的验证器中被捕获

应该是吗

function ($values, $context=[]) {
    foreach ($values as $value) {
        if ($value['el'] == '1') return false;
    }
    return true;
},

在foreach中,数组的$value不是$value吗?可能想检查是否也设置了键,是否设置了isset$值['el']?

我确信这在回调中不是错误-如果我在回调中只返回false/true,则情况相同;我要检查无效的回调。每个部分只是一个例子。