アノテーションは素晴らしいので、Doctrine EntityManger によって返されるスキーマ プロパティに基づいてフォーム要素の動作を定義できるように、コード生成でアノテーションを使用しています。私は、注釈によってエンティティ定義を 1 か所にまとめて管理しやすくすることを期待していましたが、これまでのところその通りです。
そうは言っても、注釈によって割り当てられた属性をサブクラスの他の注釈でオーバーライドできないという点で、注釈は少し柔軟性に欠けていることがわかりました。
実行時にアノテーションで設定された属性をオーバーライドするのは簡単ですが、それ以上のアノテーションではできません。(明白なことを述べているかもしれません。)
そのため、現在、コントローラーのアクションでオーバーライドを行っています。
例:
$builder = new AnnotationBuilder();
$form = $builder->createForm($myEntity);
// customize the the InputFilter for myElement
$form->getInputFilter()->get('myElement')->setAllowEmpty(FALSE);
$form->getInputFilter()->get('myElement')->setRequired(TRUE);
$form->getInputFilter()->get('myElement')->getValidatorChain()->addValidator(new \Zend\Validator\NotEmpty('all'));
// carry on with the form as normal
$form->setData($this->getRequest()->getQuery());
カスタム検証ルールを適用する必要が生じ始めたばかりであり、これらは時間の経過とともに複雑になり、おそらく条件付きでさえあると予想されるため、フォームビルダーをコントローラーからモデルに移動したいと思うでしょう。その理由は、条件付きの検証ルールの定義を開始するとき/場合、そのロジックはそれが属するモデルにあります。これにより、すべてのフォーム アセンブリがブラック ボックス メソッドに変換されるため、コントローラー アクションもクリーンアップされます。
例:
$form = $myEntityModel->buildForm($myEntity);
// carry on with the form as normal
$form->setData($this->getRequest()->getQuery());
したがって、注釈を使用してデフォルトの入力規則を定義するかどうかは問題ではないと思います。最初にそれらをどのように定義したかに関係なく、ビジネス ロジックに従ってそれらを変更します。
検証ルールをエンティティから完全に分離するという目標を達成するために、フォーム アセンブリをモデル クラスに移動することでメリットが得られるように思えます。ビジネス ロジックは、コントローラーやエンティティではなく、モデルにとどまる必要があるというあなたの本能は正しいと思います。