まず最初に:注釈はスピードキラーです。アノテーションビルダーを使用する場合は、作成したオブジェクトを常にキャッシュしてください。ただし、注釈はフォームを実行するための最も簡単な方法でもあります;)
2番目:ハイドレーター。ZF2フォームをDoctrine2と組み合わせて使用する場合、内部にあるDoctrineEntityHydratorを使用することをお勧めします。次のコードを検討してください。
$form = new ReferenzwertForm();
$form->setHydrator(new DoctrineEntity($serviceLocator->get('Doctrine\ORM\EntityManager')))
->setObject(new Referenzwert())
->setInputFilter(new ReferenzwertFilter())
->setAttribute('method', 'post');
return $form;
- ReferenzwertForm()はタイプです
Zend\Form\Form Object
- DoctrineEntity()はタイプです
DoctrineORMModule\Stdlib\Hydrator\DoctrineEntity
- DoctrineEntityには、提供されたEntityManagerが必要です。ZF2でDoctrine2を使用する場合は、これに精通している必要があります。
- Referenzwert()はエンティティオブジェクトです
アノテーションを使用せず、別のエンティティを参照している場合は、適切なフォーム要素を使用していることを確認してください(ほとんどの場合、これはselect要素です(BlogEntityなどのCategoryEntityの選択など)。
$this->add(array(
'name' => 'type',
'type' => 'DoctrineORMModule\Form\Element\DoctrineEntity',
'options' => array(
'label' => 'Choose a MyEntity',
'object_manager' => $this->getEntityManager(),
'target_class' => 'Namespace\Entity\MyEntity',
'property' => 'name'
),
'attributes' => array(
'required' => true
)
));
ご覧のとおり、Form要素はentityManagerについても知っている必要があります。これが、理想的には、最初のコード例を別のセッターで拡張して、entityManagerをフォームオブジェクトに挿入する必要がある理由です。
$form->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager'))
->set()//all the other stuff
一般的に最善のアプローチは何ですか?ないでしょう。速度を上げるために、注釈だけがキラーです。キャッシュされたバージョンを使用すると役立つはずですが、ZF2でのキャッシュに関する個人的な経験はまだありません。IDEが多くのものをサポートしているという理由だけで、注釈の外で手作業からフォームを作成するのが好きですが、フォームの注釈は確かにサポートしていません:D
これがあなたに少し役立つことを願っています、そして私は文脈からあまり多くを書きませんでした:P