検証


検証 (検証) は、Web プログラムでは非常に一般的なタスクです。フォームに入力されたデータは検証が必要です。データは、データベースに書き込まれるとき、または Web サービスに転送されるときにも検証する必要があります。

Symfony には、検証作業をシンプルかつ透過的に行う Validator コンポーネントが付属しています。このコンポーネントは JSR303 Bean 検証仕様 に基づいています。

検証の基本

検証を理解する最良の方法は、その実際の応用例を見ることです。始める前に、プログラムが必要とする場所で使用されるネイティブ PHP オブジェクトを作成すると仮定します。

// src/AppBundle/Entity/Author.phpnamespace AppBundle\Entity; class Author{
    public $name;}

これまでのところ、これはプログラムの何らかの目的を果たす単なる通常のクラスです。検証の目的は、オブジェクト内のデータが有効かどうかを確認することです。これを行うには、オブジェクトが有効であるために従う必要があるルールのリスト (constraints/constraints と呼ばれる) を構成する必要があります。これらのルールは、さまざまな形式 (YAML、XML、アノテーション、または PHP) で指定できます。

たとえば、属性 $name が空でないことを確認するには、次のコードを追加します。

PHP:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Mapping\ClassMetadata;use Symfony\Component\Validator\Constraints\NotBlank; class Author{
    public $name;     public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('name', new NotBlank());
    }}
XML:<!-- src/AppBundle/Resources/config/validation.xml --><?xml version="1.0" encoding="UTF-8" ?><constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">     <class name="AppBundle\Entity\Author">
        <property name="name">
            <constraint name="NotBlank" />
        </property>
    </class></constraint-mapping>
YAML:# src/AppBundle/Resources/config/validation.ymlAppBundle\Entity\Author:
    properties:
        name:
            - NotBlank: ~
Annotations:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Constraints as Assert; class Author{
    /**
     * @Assert\NotBlank()
     */
    public $name;}

保護されたプライベート属性と「ゲッター」メソッドも検証できます (制約された配信範囲を参照)。

検証サービスを使用する

次に、Author オブジェクトを実際に検証するには、validator ## を使用します。 # サービスの validate メソッド (Validator クラス)。 validator ジョブは単純です。クラスの制約ルールを読み取り、オブジェクト データがこれらの制約を満たしているかどうかを確認します。検証が失敗した場合は、空ではないエラー リスト (クラス ConstraintViolationList) が返されます。この簡単な例をコントローラーに実装します。

// ...use Symfony\Component\HttpFoundation\Response;use AppBundle\Entity\Author; // ...public function authorAction(){
    $author = new Author();     // ... do something to the $author object
    // ... 对 $author 对象做一些事     $validator = $this->get('validator');
    $errors = $validator->validate($author);     if (count($errors) > 0) {
        /*
         * Uses a __toString method on the $errors variable which is a
         * ConstraintViolationList object. This gives us a nice string
         * for debugging.
         * 对 $errors 变量,即 ConstraintViolationList 对象,使用 __toString 方法。
         * 这给了我们一个美观的字符串用于调试。
         */
        $errorsString = (string) $errors;         return new Response($errorsString);
    }     return new Response('The author is valid! Yes!');}

$name プロパティが空の場合、エラー メッセージ

# が表示されます。
1
2
AppBundle\Author.name:
  This value should not be blank

name 属性の値を挿入すると、快適な成功メッセージが表示されます。

ほとんどの場合、validator サービスと直接対話する必要はなく、エラー メッセージの出力について心配する必要もありません。ほとんどの場合、送信されたフォーム データを処理するときに検証を間接的に使用します。詳細については、検証とフォームを参照してください。

「エラーのコレクション」をテンプレートに渡すこともできます:

if (count($errors) > 0) {
    return $this->render('author/validation.html.twig', array(
        'errors' => $errors,
    ));}

テンプレートでは、必要に応じて正確なエラー リストを出力できます:

PHP:<!-- app/Resources/views/author/validation.html.php -->
<h3>The author has the following errors</h3>
<ul><?php foreach ($errors as $error): ?>
    <li><?php echo $error->getMessage() ?></li><?php endforeach ?></ul>
Twig:{# app/Resources/views/author/validation.html.twig #}<h3>The author has the following errors</h3>
<ul>{% for error in errors %}
    <li>{{ error.message }}</li>{% endfor %}</ul>


すべての検証エラー (「制約違反/制約違反」と呼ばれます) は、 によって引き起こされます。 ConstraintViolation レンダリングするオブジェクト。

設定

Symfony のバリデーターはデフォルトで有効になっていますが、アノテーションを使用して制約を指定する場合は、明示的に有効にする必要があります (検証) 注釈:

PHP:// app/config/config.php$container->loadFromExtension('framework', array(
    'validation' => array(
        'enable_annotations' => true,
    ),));
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:framework="http://symfony.com/schema/dic/symfony"    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd        http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">     <framework:config>
       <framework:validation enable-annotations="true" />    </framework:config></container>
YAML:# app/config/config.ymlframework:
    validation: { enable_annotations: true }


制約ルール

Validator は、制約 (つまり、ルール) に対してオブジェクトを検証するように設計されています。オブジェクトを検証するには、検証対象のクラスに 1 つ以上の制約をマップし、それを validator サービスに渡すだけです。

舞台裏では、制約は意思決定のためのステートメントを生成する PHP オブジェクトです。実際には、「ケーキが燃えてはいけない」という制約が考えられます。 Symfony の制約も同様です。制約は、条件が true かどうかについてのアサーションです。値を指定すると、その値が制約ルールに従っているかどうかが制約によってわかります。

サポートされる制約

Symfony は、最も一般的に使用される制約の多くをカプセル化します:

基本的な制約

これらは基本的な制約です。これらを使用して、プロパティ値に関する非常に基本的なことをアサートしたり、プログラム内のメソッドの戻り値をアサートしたりできます。

#メール

  • ##長さ
  • Url
  • 正規表現
  • ##Ip
  • Uuid
  • 数値制約
  • Range

比較制約
  • ##EqualTo

NotEqualTo##日付時刻

#
  • 時間
  • ##コレクション制約

    ファイル

    Bic

    ##式

    • ##すべて
    • ユーザーパスワード
    • ##有効な
    • 次のことができます独自のカスタム制約を作成することもできます。 カスタム検証制約を作成する方法 この記事では、このトピックについて説明します。

      制約の構成

      NotBlank などの一部の制約は比較的単純ですが、Choice 制約などの他の制約には、使用可能な機能が多数あります。構成オプション。 Author クラスには gender という別の属性があり、「男性」、「女性」、または「その他」に設定できるとします。

      #制約オプションは常に配列を介して渡すことができます。一部の制約では、この配列の代わりに「デフォルト」オプションの値を渡すこともできます。
      Choice
      制約では、

      choices オプションをこの方法で指定できます。

      PHP:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Mapping\ClassMetadata;use Symfony\Component\Validator\Constraints as Assert; class Author{
          public $gender;     // ...     public static function loadValidatorMetadata(ClassMetadata $metadata)
          {
              // ...         $metadata->addPropertyConstraint('gender', new Assert\Choice(array(
                  'choices' => array('male', 'female', 'other'),
                  'message' => 'Choose a valid gender.',
              )));
          }}
      XML:<!-- src/AppBundle/Resources/config/validation.xml --><?xml version="1.0" encoding="UTF-8" ?><constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">     <class name="AppBundle\Entity\Author">
              <property name="gender">
                  <constraint name="Choice">
                      <option name="choices">
                          <value>male</value>
                          <value>female</value>
                          <value>other</value>
                      </option>
                      <option name="message">Choose a valid gender.</option>
                  </constraint>
              </property>         <!-- ... -->
          </class></constraint-mapping>
      YAML:# src/AppBundle/Resources/config/validation.ymlAppBundle\Entity\Author:
          properties:
              gender:
                  - Choice: { choices: [male, female, other], message: Choose a valid gender. }
              # ...
      Annotations:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Constraints as Assert; class Author{
          /**
           * @Assert\Choice(
           *     choices = { "male", "female", "other" },
           *     message = "Choose a valid gender."
           * )
           */
          public $gender;     // ...}

      これは単に、最も一般的な構成オプションをより簡単かつ迅速に使用できるようにするためのものです。
      オプションの指定方法がわからない場合は、API ドキュメントを確認するか、念のため、オプション配列 (上記の最初のメソッド) を介してオプションを渡します。

      制約の目的

      制約は、クラス プロパティ (name

      など) またはパブリック getter メソッド (# など) に適用できます。 # #getFullName

      )、またはクラス全体。属性制約は最も一般的に使用され、最も単純ですが、Getter 制約を使用すると、より複雑な検証ルールを指定できます。最後に、クラス制約の使用例が、クラス全体を検証する場合です。 属性制約

      クラス属性の検証は、最も基本的な検証手法の 1 つです。 Symfony を使用すると、プライベート、保護された、またはパブリックのプロパティを検証できます。次のコードは、Author オブジェクトの

      $firstName

      プロパティを、少なくとも 3 文字が含まれるように構成する方法を示しています。

      ゲッター制約

      制約はメソッドの戻り値にも適用できます。 symfony を使用すると、「get」、「is」、または「has」で始まるパブリック メソッドに制約を追加できます。このタイプのメソッドは「ゲッター」と呼ばれます。

      この手法の利点は、オブジェクトを動的に検証できることです。たとえば、パスワード フィールドがユーザーの名と一致しないようにしたいとします (セキュリティ上の理由から)。これを行うには、isPasswordLegal メソッドを作成し、そのメソッドが true:

      PHP:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Mapping\ClassMetadata;use Symfony\Component\Validator\Constraints as Assert; class Author{
          protected $gender;     public static function loadValidatorMetadata(ClassMetadata $metadata)
          {
              // ...         $metadata->addPropertyConstraint(
                  'gender',
                  new Assert\Choice(array('male', 'female', 'other'))
              );
          }}
      XML:<!-- src/AppBundle/Resources/config/validation.xml --><?xml version="1.0" encoding="UTF-8" ?><constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">     <class name="AppBundle\Entity\Author">
              <property name="gender">
                  <constraint name="Choice">
                      <value>male</value>
                      <value>female</value>
                      <value>other</value>
                  </constraint>
              </property>         <!-- ... -->
          </class></constraint-mapping>
      YAML:# src/AppBundle/Resources/config/validation.ymlAppBundle\Entity\Author:
          properties:
              gender:
                  - Choice: [male, female, other]
              # ...
      Annotations:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Constraints as Assert; class Author{
          /**
           * @Assert\Choice({"male", "female", "other"})
           */
          protected $gender;     // ...}

      を返す必要があることをアサートします。次に、isPasswordLegal()## を作成します。 # 必要なロジックを含むメソッド:

      PHP:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Mapping\ClassMetadata;use Symfony\Component\Validator\Constraints as Assert; class Author{
          private $firstName;     public static function loadValidatorMetadata(ClassMetadata $metadata)
          {
              $metadata->addPropertyConstraint('firstName', new Assert\NotBlank());
              $metadata->addPropertyConstraint(
                  'firstName',
                  new Assert\Length(array("min" => 3))
              );
          }}


      鋭い観察力を持つ人は、YAML、XML、および PHP の制約構成形式にあることに気づくかもしれません。 、ゲッター プレフィックス (「get」、「is」、または「has」) はマッピング時に無視されます。これにより、検証ロジックを変更せずに、制約を同じ名前の後続のプロパティに移動 (またはその逆) することができます。


      クラス制約

      検証対象のクラス全体に適用できる制約がいくつかあります。たとえば、

      Callback タイプの制約は、クラス自体に適用できる一般的な制約です。クラスが検証されると、制約によって指定されたメソッドが直接実行され、よりカスタムな検証が提供されます。

      概要

      Symfony の

      validator (検証) は、あらゆるオブジェクトのデータが合法であることを確認するために使用できる強力なツールです。セックス。その能力は、オブジェクトのプロパティとゲッター メソッドに適用できる制約によって得られます。ほとんどの場合、検証フレームワークはフォームの使用時に間接的に適用されますが、任意のオブジェクトを検証するためにどこでも使用できることを覚えておいてください。