3

Symfony2、Doctrine、および FOSRestBundle を使用して API を構築しています。フォーム コンポーネントを使用して、レコードを作成または変更する API 要求を検証したいのですが、いくつか問題があります。検証コンポーネントを単独で使用してきましたが、すべての検証ロジックをコントローラーから移動し、要求データをエンティティにバインドし、エラー メッセージをより適切に集約するため、フォーム コンポーネントの使用に移行したいと考えています。

私が抱えている問題は、レコードが POST によって作成されているとき、または PUT によって更新されているときに、必須ではないフィールドに関係しています。理想的には、必須ではないフィールドを HTTP 経由で送信する必要がまったくないようにしたいのですが、これによりフォームの検証が失敗します。たとえば、私が使用しているエンティティのフィールドの 1 つは、endTime という DateTime フィールドであり、これは必須ではありません。endTime というパラメータが POST または PUT リクエストに存在しない場合、Symfony2 は Request からの値 null をフィールドにバインドします。これが DateTime インスタンスに変換されると、現在の日時にキャストされますが、これはまったく必要ありません。

HTTP リクエストに値が存在しない場合、値をエンティティにバインドしないように Symfony に指示する方法はありますか? エンティティ クラスの注釈に基づいて検証が失敗するため、これはまだ安全です。bind メソッドをオーバーライドすることもできますが、これは大変な作業のようです...

アイデアをありがとう。

4

3 に答える 3

2

これは、カスタム フォーム クラス検証グループを組み合わせて使用​​することで実現できます。

最初に、フォーム ( Your\Bundle\Form\CreateFormType) を作成します。このSymfony\Component\Form\AbstractTypeフォームは、 の適切な要素を使用してフォームを構築しますbuildForm

    $ビルダー
        ->add('タイトル')
        ->add('firstNames');

次に、各エンティティ プロパティの検証を追加できます。一緒に検証する必要がある各プロパティは、同じグループを共有する必要があります。

例えば

    あなたの\バンドル\エンティティ\ユーザー:
        プロパティ:
            題名:
                - 空白でない:
                    グループ: [登録]
                    メッセージ: タイトルを入力してください
            ファーストネーム:
                - 空白でない:
                    グループ: [登録]
                    メッセージ: お名前を入力してください

の別のグループ (およびカスタム フォーム) もupdateあり、その要求に存在するプロパティが含まれます。

フォーム クラスで、で使用される検証グループを構成しますsetDefaultOptions()

    $resolver->setDefaults(array(
        // ...
        'validation_groups' => array('register'),
        // ...
    ));

于 2012-11-19T12:29:52.623 に答える
2

preBindイベント時に、送信されていないフィールドを null の代わりにデフォルト値 (つまり、バインドされているオブジェクトの値) に置き換えるForm EventSubscriber を作成できます。

私が作成した EvenSubscriber は次のとおりです: https://gist.github.com/3766678。デフォルトでは、私の実装では、必須ではないフィールドのみが null の代わりにデフォルト値を持ちます...

作成者タグを保持している限り、あなたと誰でもこのクラスを自由に使用できます ;-)

于 2012-09-22T16:37:48.100 に答える
2

必須ではないフィールドをキーとして配列を作成し、その配列の上にリクエスト POST または PUT をマージして、それをフォームにバインドします。そうすれば、ヒントの必須フィールドがフォームにあり、提供された場合は要求データが含まれます。

于 2012-09-22T13:17:02.963 に答える