Symfony 2 でフォームなしでエンティティを検証する 質問する

Symfony 2 でフォームなしでエンティティを検証する 質問する

Symfony 2 用の REST API コントローラーを作成しています。SensioGeneratorBundle を使用して CRUD を作成し、コントローラーを REST コントローラーとして機能するように変更しました。ただし、フォームがないので、この部分を削除することを考えています。

フォームなしでフィールドを検証するにはどうすればいいでしょうか? すべてがフォームに接続されており、フィールド名のカスタマイズなど、ある程度の自由度が必要です。たとえば、POST x フィールドと y フィールドは、Symfony によってタイトルとコンテンツとして解釈されます。

ベストアンサー1

実のところ、フォームは検証に直接関係していません。これについて説明しましょう。

フォーム コンポーネントは、GET データでも POST データでも、クライアントから受信したデータをマッピングする役割を担います。つまり、文字列をコードのオブジェクトにマッピングします (エンティティにバインドしない場合は配列にすることができます)。

フォームは、データがマッピングされた後にバリデータ コンポーネントを使用してエンティティを検証します。つまり、エンティティの検証はフォーム コンポーネントから完全に分離されます。したがって、フォームが検証される場合、フォーム コンポーネントはフォーム データではなくエンティティを検証することになります。検証されるのはフォームではなくエンティティです。

このフォームは、文字列表現を取得してエンティティ階層にマッピングするためだけに使用されます。ドキュメントでは、これを次のように反映しています。形状そしてその検証symfonyの明確なセクションです

そうは言っても、これはエンティティの検証がフォームコンポーネントの外で非常に簡単に実行できることも意味します。制約を注釈として、または外部ファイル(yml、php、またはxml)で定義し、検証コンポーネントを使用してエンティティを検証します。以下は、検証本のセクション:

use Symfony\Component\HttpFoundation\Response;
use Acme\BlogBundle\Entity\Author;
// ...

public function indexAction()
{
    $author = new Author();
    // ... do something to the $author object

    $validator = $this->get('validator');
    $errors = $validator->validate($author);

    if (count($errors) > 0) {
        return new Response(print_r($errors, true));
    } else {
        return new Response('The author is valid! Yes!');
    }
}

ご覧のとおり、ここではフォームは関係なく、オブジェクトと検証サービスのみが使用されます。さらに、Symfony2 の検証コンポーネントは完全にスタンドアロンです。つまり、フレームワーク全体がなくても使用できます。ただし、スタンドアロンで使用すると、他のものとの優れた統合が失われます。

この方法では、REST サービスはパラメータを受け取り、そこからエンティティを作成し、バリデータ サービスを使用してその整合性を検証します。エンティティを検証するためにフォームを使用することは必須ではありません。

おすすめ記事