Zend framework2 Zend Framework 2验证程序中其他字段验证的访问结果

Zend framework2 Zend Framework 2验证程序中其他字段验证的访问结果,zend-framework2,Zend Framework2,我有一张有两个日期的表格,开始和结束。我有一个用于开始的验证器,我想验证停止,并且停止是在开始之后。但只有在start有效时,后验证才有意义 isValid($value,$context=null)可以传递给上下文变量中的其他值,但是我必须再次执行开始检查 因此,是否可以在停止验证器的isValid()函数中检查启动验证的结果?您可以使用 或者写下你的 ------编辑-我的建议答案-带回调或验证程序的输入过滤器------ 我是这样做的 首先创建一个包含所有参数的过滤器: namespace

我有一张有两个日期的表格,开始和结束。我有一个用于开始的验证器,我想验证停止,并且停止是在开始之后。但只有在start有效时,后验证才有意义

isValid($value,$context=null)
可以传递给上下文变量中的其他值,但是我必须再次执行开始检查

因此,是否可以在停止验证器的
isValid()
函数中检查启动验证的结果?

您可以使用

或者写下你的

------编辑-我的建议答案-带回调或验证程序的输入过滤器------

我是这样做的

首先创建一个包含所有参数的过滤器:

namespace MyGreatNameSpace\Filter;

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;

class MyDateFilter extends InputFilter
{

    public function __construct($myGreatClass)
    {

        $factory = new InputFactory();

        $this->add($factory->createInput(array(
            'name'       => 'start_date',
            'required'   => true,
            'validators' => array(
                array(
                    'name' => 'Date',
                    'options' => array(
                        'format' => '2000-10-10',
                    ),
                )
            ),
        )));

        $this->add($factory->createInput(array(
            'name'       => 'end_date',
            'required'   => true,
            'validators' => array(
                array(
                    'name' => 'Date',
                    'options' => array(
                        'format' => '2000-10-10',
                    ),
                ),
                array(
                    'name'              => 'Callback',
                    'options'           => array(
                        'callback'      => array($myGreatClass, 'isDateNewer'),
                        'messages'      => array(
                            'callbackValue'  => "The end date is Older then the start date",
                        ),
                    ),
                ),
            ),
        )));


    } // End of __construct
}
创建

在控制器中植入(我使用服务拉动表单/过滤器类)

另一种稍有不同的方法(尽管更简洁)是编写验证器。检查(注意标记)


使用验证器规范中的
break\u chain\u on\u failure
参数->这样,只有在开始有效时才会调用停止验证器。感谢您的评论。这会打破一个输入或所有输入的链条吗?无论如何,这两种情况都不是我想要的。因为停止是启动后的一个附加输入,它不能是最后一个。谢谢你的回答。我知道这种可能性,但它们并不能解决问题。问题是如何访问以前的验证结果。以前的验证是指检查停止点的不同范围?(不同的类、函数等)一个表单至少包含这两个字段,每个字段都有自己的验证器。正如我在问题中所述,我在
$context
变量中得到字段值,但没有得到验证结果。目前,我正在
stop
的验证器中重新验证
start
,因为当
start
不是有效日期时,验证
stop
是否在
start
之后是没有意义的。假设您从同一表单获得start和stop,并希望在同一位置进行检查。为什么不使用inputFilter?如果这是您希望的,我可以粘贴一个示例是的,它们来自同一表单。在inputFilter中,为每个字段指定一个验证器。在这些验证器中,停止验证器存在问题。
public function isDateNewer($date, $params)
{
    $date2 = $params['start_date'];

    if ($date > $date2) { // Over simplistic
        return TRUE;
    }
}
// Get the form / validator objects from the SM
$form   = $this->getServiceLocator()->get('date_form');
$filter = $this->getServiceLocator()->get('date_filter');

// Inject the input filter object to the form object, load the form with data and bind the result to the model
$form->setInputFilter($filter);
$form->setData($post);
$form->bind($myModel); // (if you wish to bind the data to whatever)

if (!$form->isValid()) {
    return $this->forward()->dispatch.... (or whatever)
}
array(
    'name' => '\Application\Validator\myNewNamedValidator',
    'options' => array(
        'token' => 'start_date',
        'messages' => array(
            'older' => "The end date is Older then the start date",
        ),
    ),
),