2012-11-19 55 views
2

我試圖實現RowGateway類到我的實體,我已經有一個窗體與實體工作,我試圖設置水合器與ClassMethods一起使用。ZF2 Classmethods Hydrator與RowGateway合作

我也注意到,ArraySerializable水化調用populate()方法或exchangeArray()和編輯一行時,此方法設置相應的主鍵,可惜ClassMethods保溼沒有做到這一點。

使用Classmethod水化器時,設置正確的主鍵值的最佳方法是什麼?我應該在將實體綁定到表單之前設置此值嗎?或者,我是否應該擴展Classmethod H.以在初始化時執行此任務?

回答

2

我不喜歡的在我的實體中使用數據層的知識。在使用exchangeArray()時,您可以在實體本身中創建映射。我對Zend的hydrators進行了一些研究,並發現了包括這個帖子在內的帖子。 Andrew擴展hydrator的例子似乎是將列名映射到getter/setters名稱的一種好方法。

當延長ClassMethods水合物時,您也可以使用implement Zend\Stdlib\Hydrator\HydratorInterface

對於數據處理使用水化器策略

http://framework.zend.com/manual/2.0/en/modules/zend.stdlib.hydrator.strategy.html http://juriansluiman.nl/nl/article/125/strategies-for-hydrators-a-practical-use-case

要sepperate你的實體在複式數據源可以使用水化過濾器。例如,默認情況下,水化器提取所有以get開頭的實體方法。

http://framework.zend.com/manual/2.1/en/modules/zend.stdlib.hydrator.filter.html

+0

我接受這個答案,因爲經過大量閱讀後,我發現應該通過Hydrators完成對象羣體,並且定製Hydrator會是最好的方法。 此外,我最終結束了使用[Doctrine2](http://www.doctrine-project.org/),因爲它提供了一個擴展數據庫層,Hydrator包含提供了所需的功能。 –

1

您可以擴展Zend \ Stdlib \ Hydrator \ ClassMethods並進行所需的任何轉換,假設這是您的意思。

然後,您可以使用mapField將其中一個字段映射到正確的id字段名稱。

namespace Application\Model; 

use Zend\Stdlib\Hydrator\ClassMethods; 

class MyHydrator extends ClassMethods 
{ 
    /** 
    * Extract values from an object 
    * 
    * @param object $object 
    * @return array 
    * @throws Exception\InvalidArgumentException 
    */ 
    public function extract($object) 
    {    
     $data = parent::extract($object); 
     $data = $this->mapField('id', 'user_id', $data); 

     return $data; 
    } 

    /** 
    * Map fields 
    * 
    * @param type $keyFrom 
    * @param type $keyTo 
    * @param array $array 
    * @return array 
    */ 
    protected function mapField($keyFrom, $keyTo, array $array) 
    { 
     $array[$keyTo] = $array[$keyFrom]; 
     unset($array[$keyFrom]); 

     return $array; 
    } 
} 

另外,您可以讓您需要設置/獲取,例如id字段一個getter和setter,如果你有一個名爲ID「user_ID的」:

public function getUserId() { .. } 

public function setUserId($id) { .. } 
+0

我覺得你的classmethods擴展是非常好的。 我認爲你的getter/setter建議存在問題,但它不適用於classmethods,因爲這些值永遠不會被初始設置(如果UserId不存在作爲列名稱,那麼'setUserID()'永遠不會所謂的)。 – Beeblebrox