45

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

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

4

1 に答える 1

86

確かに、フォームは検証に直接関係していません。これを説明させてください。

フォームコンポーネントは、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サービスはパラメーターを受け取り、そこからエンティティを作成し、バリデーターサービスを使用してそれらの整合性を検証します。フォームの使用は、エンティティの検証に必須ではありません。

于 2012-04-26T03:19:18.463 に答える