これは注意が必要ですが、Zend Framework 1.X で似たようなものを構築したい場合は、おそらく を拡張する必要がありますZend_Form
。
EntityManager
そのようにして、 (またはジェネリックDoctrine\Common\Persistence\ObjectManager
をエンティティと共に依存関係として受け入れるクラスを構築できます。
その後、エンティティに関連付けられたメタデータを分析するか、そのエンティティに対してチェックする必要がある一連のフィールドを定義できます。通常、Doctrine\Common\Persistence\Mapping\ClassMetadata
コンストラクターで次のようにインスタンスを操作します。
// in class Your\Form\EntityDriven
// $this->em is the EntityManager passed in
// $this->entity is the Entity object passed to the constructor
$class = $this->em->getClassMetadata(get_class($this->entity));
foreach ($class->getFieldNames() as $fieldName) {
// Add fieldst to the form based by their eventual @Column(type="...")
// Eventually, you could use your own AnnotationDriver to get more
// constraints as Symfony 2 does
}
それは実際にうまくいくはずです。ただし、バリデータはフォーム インスタンスにアタッチされます。フォームを永続化するにはpersistData
、次のようにパブリック メソッドをオーバーライドするだけです。
public function persistData()
{
$this->em->persist($this->entity);
$this->em->flush($this->entity);
}
@postPersist
またはのようなライフサイクルイベント内に検証を配置しません@preUpdate
。これらの場合の永続化を防ぐ唯一の方法は、例外をスローすることです (外部リスナーを使用する場合を除きますが、それはさらに複雑です)。閉じた になりEntityManager
ます。
Zend Framework 2 に適用された概念に興味がある場合、新しいZend\Form
( diff を参照) コンポーネントはハイドレーターを使用してモデルに値を割り当てるため、モデルと直接やり取りするのではなく、ロジックを使用してセッター/ゲッターまたはパブリック プロパティ (例として)。入力フィルタリングはZend\InputFilter
、フォームなしでも使用する必要があるため (やりたいこと)、新しいコンポーネントとして移動されました。検証は既に分離されていますが、通常、データが有効でない場合はハイドレーターを実行しないでください。EntityHydrator
これで、 andを書けるはずですEntityValidator
。貢献したい場合は、DoctrineModuleでプル リクエストを送信してください:)