2012-10-23 3 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(私が実装する方法を研究する必要があると思います)、ハイドレーターまたは(私も実装するための最良の方法を把握する必要があるだろう、)
  2. 使用doctrine2のハイドレーター
+0

を使用するmodule.config.phpに次のコードを使用します。 ZF2がオブジェクト/エンティティをフォームにバインドする方法は、割り当てられたHydratorが、参照されているフォームフィールドが適切にマッピングされていることを確認します。これは実際には非常にシンプルなユースケースであり、エラーメッセージによって与えられるように、あなたはいつも見るべきところを知っているでしょう。 – Sam

答えて

14

:あなたの中に

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

私は私のエンティティクラスでpopulateメソッドを使用します。 この

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();のようなことをしています。 $ form-> bind($ entity)です。 My $エンティティはdoctrne2のgetServiceLocator()を使用しており、getQueryBuilder()を使用してクエリを作成します。 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/私はほぼ同じアプローチを使用して、それが(ほぼ)うまく機能しています。検証されたフィールドのみがDBに送信されるため、テーブルにあるすべてのデータ(または少なくともnullでないデータ)を検証するようにしてください。このブログの作者が私に言った。 :)

2)あなたが編集フォームのビューを作成すると、ルートにIDを追加します。

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

幸運を!

のZend \フォームはあなたのエンティティクラスにそのような何かを持っている必要があり、あなたのエンティティを水和することができることについては
2

... /モデル/ XXXXTable.php
機能が欲しい定義レコードを取得する。

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

本当にありがとう、私の時間を救った。 –

2

私は、実際のエラーメッセージを含むようにあなたの質問を変更してください教義ハイドレーター

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