Symfony 2 Book 09:検証


検証はWebアプリケーションで非常に一般的なタスクです.フォームに記入されたデータは検証が必要であり、データベースに書き込まれたり、Webサービスに送信されたりする場合も検証が必要です.
Symfony 2に付属するValidatorコンポーネントは、このタスクを簡単かつ透明にします.このコンポーネントはJSR 303 Bean検証仕様に基づいている.何?PHPでJAVA仕様を使う?あなたは間違っていませんが、それはそんなに悪く聞こえません.PHPでどのように使われているか見てみましょう.
検証ベース
検証を理解する最善の方法は実戦で学ぶことだ.まず、簡単なPHPオブジェクト(plain-old-PHP-Object、POPOPOと略称)を作成したと仮定します.アプリケーションで使用する必要があります.

  
  
  
  
  1. // Acme/BlogBundle/Author.php 
  2. class Author 
  3.     public $name

これまでは、アプリケーションでいくつかのターゲットを達成する一般的なクラスにすぎませんでした.検証の目的は、オブジェクト内のデータが正当であるかどうかを示すことです.検証を行うためには、オブジェクトが遵守しなければならないルールのリスト(制限と呼ばれる)を構成する必要があります.これらのルールは、異なるフォーマット(YAML、XML、注釈、PHP)で使用できます.を指定します.$name属性が空でないことを保証するには、次の内容を追加する必要があります.

  
  
  
  
  1. # Acme/BlogBundle/Resources/config/validation.yml 
  2. Acme\BlogBundle\Author: 
  3.     properties: 
  4.         name
  5.             - NotBlank: ~ 

「getter」のように、保護およびプライベート属性も検証できます(validator-constraint-targetsを参照).
認証サービスの使用
Authorオブジェクトを検証するには、検証サービス(Validatorクラス)のvalidateメソッドを使用する必要があります.検証は簡単です.ルールなどのクラス制限を表示し、オブジェクトデータがそれらの制限に合致しているかどうかを検証します.検証に失敗した場合は、エラー配列を返します.コントローラの内部から簡単な例を示します.

  
  
  
  
  1. use Symfony\Component\HttpFoundation\Response; 
  2. // ... 
  3.  
  4. public function indexAction() 
  5.     $author = new Acme\BlogBundle\Author(); 
  6.     // ... do something to the $author object 
  7.  
  8.     $validator = $container->get('validator'); 
  9.     $errorList = $validator->validate($author); 
  10.  
  11.     if (count($errorList) > 0) { 
  12.         return new Response(print_r($errorList, true)); 
  13.     } else { 
  14.         return new Response('The author is valid! Yes!'); 
  15.     } 

 $nameプロパティが空の場合、次のエラーメッセージが表示されます.

  
  
  
  
  1. Acme\BlogBundle\Author.name
  2.     This value should not be blank 

 nameプロパティに値を挿入すると、検証に成功したメッセージが表示されます.
各検証エラー(「制限違反」)は、エラーを記述するメッセージを保持するConstraintViolationオブジェクトによって表現されます.また、validateメソッドはクラス配列のConstraintVoilationListオブジェクトを返します.検証して返すエラーをより先進的な方法で使用するには、長い道のりがあります.テンプレートをシェーディングして$errorList変数を送信することができます.

  
  
  
  
  1. if (count($errorList) > 0) { 
  2.     return $this->render('AcmeBlogBundle:Author:validate.html.twig'array
  3.         'errorList' => $errorList
  4.     )); 
  5. else { 
  6.     // ... 

テンプレートでは、必要なエラーのリストのみを出力できます.

  
  
  
  
  1. {# src/Acme/BlogBundle/Resources/views/Author/validate.html.twig #} 
  2.  
  3. <h3>The author has the following errors</h3> 
  4. <ul> 
  5. {% for error in errorList %} 
  6.     <li>{{ error.message }}</li> 
  7. {% endfor %} 
  8. </ul> 

 検証とフォーム
検証サービスは、いつでも任意のオブジェクトを検証するために使用できます.しかし、実際には、Formクラスを介して間接的に検証を使用します.Formクラスは、検証サービスを使用して、値がコミットまたは制約されたときに下位オブジェクトを検証します.オブジェクトの制限制約は、FieldErrorイメージに変換され、フォームに表示されます.

  
  
  
  
  1. $author = new Acme\BlogBundle\Author(); 
  2. $form = new Acme\BlogBundle\AuthorForm('author'$author$this->get('validator')); 
  3. $form->bind($this->get('request')->request->get('customer')); 
  4.  
  5. if ($form->isValid()) { 
  6.     // process the Author object 
  7. else { 
  8.     // render the template with the errors 
  9.     $this->render('BlogBundle:Author:form.html.twig'array('form' => $form)); 

詳細については、フォームの章を参照してください.
コンフィギュレーション
Symfony 2認証を使用するには、アプリケーション構成で使用可能であることを確認する必要があります.

  
  
  
  
  1. # hello/config/config.yml 
  2. framework: 
  3.     validation: { enabled: true, annotations: true } 

アノテーションマッピングで制限されている場合は、アノテーション構成をtrueに設定するだけです.
制限
検証は、オブジェクトがルールなどの制限に違反しているかどうかを検証するために設計されています.オブジェクトを検証するには、1つ以上の制限が適用されているクラスを簡単にマッピングし、検証サービスに送信します.
制限は、単にPHPオブジェクトであり、制限ルールの宣言を生成します.実際の生活では、制限は「ケーキが燃えない」とすることができます.Symfony 2では、制限も似ています.条件が真であると宣言されています.制限は、制限ルールに合致するかどうかを示す値を指定します.
サポートの制限
Symfony 2には多くの一般的な制限が含まれています.制限の詳細に関する完全なリストは、制限の参照セクションで参照できます.
構成の制限
空でないなどの制限は簡単ですが、制限を選択するなど、いくつかの使用可能な構成オプションがあります.これらの使用可能なオプションは、制限に共通のプロパティです.制限に1つのオプション配列を送信することで、それぞれを設定できます.Authorクラスには、「男」または「女」に設定できる別の性別プロパティがあるとします.

  
  
  
  
  1. # Acme/BlogBundle/Resources/config/validation.yml 
  2. Acme\BlogBundle\Author: 
  3.     properties: 
  4.         gender: 
  5.             - Choice: { choices: [male, female], message: Choose a valid gender. } 

制限オプションは常に配列として送信されます.いくつかの制限では、配列の代わりに「デフォルト」オプションから制限を送信できます.次のChoice制限の例では、choicesオプションはこの方法で指定されています.

  
  
  
  
  1. # Acme/BlogBundle/Resources/config/validation.yml 
  2. Acme\BlogBundle\Author: 
  3.     properties: 
  4.         gender: 
  5.             - Choice: [male, female] 

指定したオプションの2つの異なる方法で混乱させないようにしてください.不確定な場合は、制限されたAPIドキュメントをチェックするか、オプション配列を常に送信します(上記の第1の方法で表示されているように)、少なくとも安全です.
制限されたオブジェクト
制限はクラス属性または共通のgetterメソッド(getFullNameなど)に適用できます.
ツールバーの
クラス属性の検証は最も基本的な検証テクニックです.Symfony 2では、プライベート、保護、および共通の属性を検証できます.Authorクラスの$firstNameおよび$lastName属性の少なくとも3文字の構成方法を説明します.

  
  
  
  
  1. # Acme/BlogBundle/Resources/config/validation.yml 
  2. Acme\BlogBundle\Author: 
  3.     properties: 
  4.         firstName: 
  5.             - NotBlank: ~ 
  6.             - MinLength: 3 
  7.         lastName: 
  8.             - NotBlank: ~ 
  9.             - MinLength: 3 

Getters
制限は、値を返すメソッドにも適用できます.Symfony 2では、任意の名前の「get」または「is」を持つ共通メソッドに制限を追加できます.このウィザードでは、両方のメソッドを「getters」と呼びます.
このテクニックの利点は、オブジェクトを動的に検証できることです.オブジェクトのステータスに応じて、メソッドは異なる値を返し、検証します.
次に、True制限を使用して、動的に生成されたトークンが正しいかどうかを検証する方法を示します.

  
  
  
  
  1. # Acme/BlogBundle/Resources/config/validation.yml 
  2. Acme\BlogBundle\Author: 
  3.     getters: 
  4.         tokenValid: 
  5.             - True: { message: "The token is invalid" } 

 
共通のisTokenValidメソッドは、内部トークンが正当かどうかを決定し、trueまたはfalseを返す論理を実行します.
目の前のgetterの接頭辞(「get」または「is」)がマッピングで無視されていることに気づきました.これにより、認証ロジックを変更することなく、同じ名前の属性(逆も同様)に制限を移動できます.
最後の点
Symfony 2ベリファイアは、任意のオブジェクトデータの「有効性」を保証する強力なツールです.検証の背後にある力は「制限」です.これは、属性またはオブジェクトのgetterメソッドに適用できるルールです.最も一般的な検証フレームを使用してフォームを間接的に使用する場合は、任意の場所で任意のオブジェクトを検証できることを覚えておいてください.