2015-11-20 30 views
0

我試圖使用Zend\Validator來驗證對象,但是我發現很難有幾個原因,現在想知道我是否在做一些根本性錯誤或者組件是不是一個不錯的選擇,這樣做......使用Zend Validator驗證對象

理想情況下,我想運行

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

因此,在這種情況下,我會把(子)在ObjectValidatorisValid()方法驗證器爲對象的屬性,例如像這個:

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。這樣,我當然可以得到所有的信息,但是在我驗證它之前,它會添加一個相當煩人的拆除對象的任務。

任何輸入高度讚賞。

回答

0

我建議使用the ZF2 InputFilter class作爲深度驗證對象和屬性的基礎。

您可以實現Zend\Stdlib\ArraySerializableInterface接口解決問題與​​方法「拆解的對象煩人的任務」:

<?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 
    } 
} 

或進行自定義的水化類,這是否對你...

+0

@ pitty.platsch是否使用'InputFilter'類和建議的接口爲您解決問題? – Wilt

+0

我同意。您應該使用'Zend \ StdLib \ Hydrator'從對象中提取數據並使用'Zend \ InputFilter \ InputFilter'來驗證數據。 Zend的Hydrators已經[支持不同的方式](http://framework.zend.com/manual/current/en/modules/zend.stdlib.hydrator.html#available-implementations)從對象中提取數據。 –