検証
検証 (検証) は、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 プロパティが空の場合、エラー メッセージ