2012-10-23 23 views
7

除了使用bind()之外,還有更好的方法將數據從doctrine2 ODM實體類綁定到Zend2表單嗎?從doctrine2綁定Zend2表單數據ODM

如果是這樣,它會是什麼?我只是將數據作爲數組檢索並傳遞給每個單獨的字段?我正在爲此苦苦掙扎,而且很可能使它比需要的更難。

當我調用bind()函數時,它輸出一個引用缺省水合器的Zend錯誤。我需要在我的實體課中做些特別的事情嗎?

編輯:這裏是確切的錯誤,Zend公司拋

〜\供應商\ zendframework \ zendframework \庫\ Zend的\ STDLIB \保溼\ ArraySerializable.php:35

的Zend \ STDLIB \保溼\ ArraySerializable ::提取物預計提供 對象實現getArrayCopy()

他們讓我覺得我需要:

  1. 使用Zends hydrators(我不得不研究如何實現)或
  2. 使用doctrine2的hydrators(其中,我也不得不找出最佳的方式來實現)
+0

請修改您的問題包含實際的錯誤消息。 ZF2的工作方式是將對象/實體綁定到表單,然後分配的Hydrator確保引用的表單字段被適當映射。這實際上是一個非常簡單的用例和一個很好的問題分離,如錯誤消息所給出的,您將始終知道在哪裏尋找。 – Sam

回答

14

對於Zend的\表能夠保溼你的實體,你需要有類似的東西在你的實體類:

public function getArrayCopy() 
{ 
    return get_object_vars($this); 
} 
+1

自動補水魔術,ZF2風格。簡單的學習曲線... –

+1

被get_object_vars函數吸引了。參考:[get_object_vars](http://php.net/manual/en/function.get-object-vars.php) - 「根據範圍獲取給定對象的可訪問的非靜態屬性。」 –

+1

爲了更清楚,我們將上面的方法添加到這個文件中:'\ zf2-tutorial \ module \ Album \ src \ Album \ Model \ Album.php'。 –

1

我在我的實體類中使用填充方法。 像這樣

public function populate($data = array()) 
    { 
     $this->id = (isset($data['id'])) ? $data['id'] : null; 
     $this->username = (isset($data['username'])) ? $data['username'] : null; 
     $this->pass = (isset($data['pass'])) ? $data['pass'] : null;    

    } 

,然後在控制器,你可以使用填充功能,這樣的事情。

$user = new User(); 
$request = $this->getRequest(); 
$user->populate($request->getPost()); 

我不知道我是否正確理解您的問題。

+0

基本上,我的問題屬於editAction()。我希望用戶能夠編輯他們已經發布的信息,顯然。我做了一些研究,發現Zend使用了一個bind()方法,它將從我的實體中提取數據並填充表單進行編輯。目前我正在做$ form = new Form(); $形式 - >結合($實體)。我的$實體使用doctrne2的getServiceLocator(),並使用getQueryBuilder()構建查詢。當我導航到我的editAction時,出現以下錯誤Zend \ Stdlib \ Hydrator \ ArraySerializable :: extract期望提供的對象實現getArrayCopy() – bl4design

1

幸運的是,如果按照本教程中,你不需要任何更多的在你的實體:

http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/我用幾乎同樣的方法,它是(幾乎)運作良好。兩件事你應該關心:

1)請確保您驗證您的表中的所有數據(或至少不是空的),因爲只有經過驗證的字段發送到數據庫。它是由這個博客的作者告訴我的。 :)

2)當您創建編輯表單視圖,該ID添加到路線:

$form->setAttribute('action', $this->url('post', 
        array('action'=>'add', 'id'=>"$this->id")))->prepare(); 

祝你好運!

2

... /型號/ XXXXTable.php
定義一個函數希望獲得記錄。

$id = (int)$id; 
    $row = $this->tableGateway->select(array('id'=>$id)); 
    $row = $row->current(); //this line is very important 
+0

謝謝,真的節省了我的時間。 –

2

我用下面的代碼在module.config.php使用學說水化

$form = new ...; 
$dm = $sm->get('doctrine.documentmanager.odm_default'); 
$form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($dm)); 
return $form;