使用Zend \ Validator验证对象

时间:2015-11-20 11:34:41

标签: php validation zend-framework2 zend-validate

我试图使用Zend\Validator来验证对象,但我发现它很难有几个原因,现在我想知道我是否做了一些根本错误的事情或者组件是不是这是一个很好的选择...

理想情况下,我想运行

$objectValidator = new ObjectValidator();
$objectValidator->isValid($object);

所以在这种情况下,我会在ObjectValidator' isValid()方法中为对象属性设置(子)验证器,例如:

public function isValid($value, $context = null)
{
    $propertyValidator = new Zend\Validator\Callback(function($value) {
        return false;
    });
    if (!$propertyValidator->isValid($value)) {
        foreach ($propertyValidator->getMessages() as $code => $message) {
            $this->abstractOptions['messages'][$code] = $message;
        }
        return false;
    }

    return true;
}

合并来自已从EmailAddress验证程序返回的组件Hostname验证程序复制的属性验证程序的邮件的方法。

当我使用一种类型的验证器两次(例如Callback)时,麻烦就开始了,无论是在同一个属性上还是在同一个属性上,因为消息被合并了,而且我丢失的信息是我想拥有。我可以自己构建一种管理邮件的方法,但我想知道是否有更好的解决方案。

我还想过使用Zend\InputFilter而不是为我要运行检查的每个属性创建Zend\Input。这样我肯定得到了所有的消息,但是在我验证它之前,它增加了一个相当烦人的拆解对象的任务。

任何输入都受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

我建议使用the ZF2 InputFilter class作为深度验证对象和属性的基础。

您可以使用Zend\Stdlib\ArraySerializableInterface方法实现getArrayCopy接口来解决&#34;令人烦恼的使用<?php namespace Application\Model; use Zend\Stdlib\ArraySerializableInterface; class MyObject implements ArraySerializableInterface { /** * Exchange internal values from provided array * * @param array $array * @return void */ public function exchangeArray(array $array) { //...Your custom logic to exchange properties with data from an array } /** * Return an array representation of the object * * @return array */ public function getArrayCopy() { //...Your custom logic to get array copy of the object for validation } } 方法解决对象&#34; 问题的任务:

/usr/bin/ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) /usr/bin/gem push dogeify-1.0.0.gem -k 4393c168a8a078a5008e4697b800276a
Enter your RubyGems.org credentials.
Don't have an account yet? Create one at https://rubygems.org/sign_up

HTTP Basic: Access denied.

Process finished with exit code 1

或者为你做一个定制的保湿课程......