확인
검증은 웹 프로그램에서 매우 일반적인 작업입니다. 양식에 입력된 데이터에는 유효성 검사가 필요합니다. 또한 데이터베이스에 기록되거나 웹 서비스로 전송될 때 데이터의 유효성을 검사해야 합니다.
Symfony에는 유효성 검사를 간단하고 투명하게 해주는 Validator 구성 요소가 함께 제공됩니다. 이 구성 요소는 JSR303 Bean 유효성 검사 사양을 기반으로 합니다.
검증의 기초 ¶
검증을 이해하는 가장 좋은 방법은 검증을 실제로 보는 것입니다. 시작하기 전에 프로그램이 필요한 곳에서 사용되는 기본 PHP 개체를 생성한다고 가정해 보겠습니다.
// src/AppBundle/Entity/Author.phpnamespace AppBundle\Entity; class Author{ public $name;}
지금까지는 프로그램에 특정 목적을 제공하는 일반적인 클래스에 불과합니다. 검증의 목적은 객체의 데이터가 유효한지 여부를 알려주는 것입니다. 이렇게 하려면 개체가 유효하기 위해 따라야 하는 규칙 목록(제약 조건/제약 조건이라고 함)을 구성해야 합니다. 이러한 규칙은 다양한 형식(YAML, XML, 주석 또는 PHP)으로 지정할 수 있습니다.
예를 들어 $name
속성이 비어 있지 않은지 확인하려면 다음 콘텐츠를 추가하세요. $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;}
Protected和private属性以及“getter”方法也可以被验证(见 约束的投放范围)。
使用验证服务 ¶
接下来,要真正的校验 Author
对象,使用 validator
服务(Validator
类)的 validate
方法。 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
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>
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>🎜🎜 🎜🎜🎜
name
속성에 값을 입력하면 기분 좋은 성공 메시지가 나타납니다. name
属性插入一个值,令人高兴的成功信息就会出现。
多数时候,你不需要直接跟 validator
服务互动,或者毋须为输出错误信息担心。多数情况下,你在处理提交过来的表单数据时,间接地使用validation验证。参考 验证与表单 以了解更多。
你也可以传递“错误信息集合”(collection of errors)到模版中:
YAML:# app/config/config.ymlframework: validation: { enable_annotations: true }
在模版中,你可以根据需要精确输出错误列表:
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>
每一个验证错误(被称为“constraint violation/约束违反”)都由一个 ConstraintViolation
검증기
와 직접 상호작용할 필요가 없습니다. 그렇지 않으면 출력을 제공할 필요가 없습니다. 오류 메시지를 걱정하세요. 대부분의 경우 제출된 양식 데이터를 처리할 때 유효성 검사를 간접적으로 사용합니다. 자세한 내용은 검증 및 양식 "오류 모음"을 템플릿에 전달할 수도 있습니다:
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; // ...}
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')) ); }}
ConstraintViolation🎜
개체를 렌더링합니다. 🎜🎜🎜🎜구성 🎜¶🎜🎜🎜Symfony의 유효성 검사기는 기본적으로 활성화되어 있지만 주석을 사용하여 제약 조건을 지정하는 경우 (확인을 위해) 명시적으로 주석을 활성화해야 합니다. 🎜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; // ...}🎜🎜🎜🎜
제약 규칙 ¶
Validator
被设计成针对 约束(即规则)来验证对象。要验证一个对象,只需把一或多个约束映射到它要验证的类,然后再把它传递给 validator
그냥 서브하세요.
뒤에서 제약 조건은 의사 결정을 위한 명령문을 생성하는 PHP 개체입니다. 실제로 제약 조건은 "케이크가 타서는 안 된다"일 수 있습니다. Symfony에서 제약조건은 유사합니다. 즉, 조건이 참인지에 대한 단언입니다. 값이 주어지면 제약 조건은 해당 값이 제약 조건 규칙을 준수하는지 여부를 알려줍니다.
지원되는 제약 조건 ¶
Symfony는 가장 일반적으로 사용되는 많은 제약 조건을 캡슐화합니다.
기본 제약 조건 ¶
다음은 기본 제약 조건입니다. 이를 사용하여 속성 값과 관련된 매우 기본적인 사항을 주장하거나 you 프로그램에서 메서드의 반환 값입니다.
문자열 제약 조건 ¶
숫자 제약 조건 ¶
비교 제약 조건 ¶
- EqualTo
- NotEqualTo
- 같은 To
- 동일하지 않음 LessThan
- LessThanOrEqual
- GreaterThan
- erThanOrEqual
- 날짜 제약 조건 ¶
Date
수집 제약 조건 ¶
파일 제약 조건 ¶
재무 번호 제약 ¶
기타 제약 조건 ¶
자신만의 정의를 만들 수도 있습니다. 제약. 사용자 지정 유효성 검사 제약 조건을 만드는 방법 문서에서 이 주제를 다룹니다.
제약 조건 구성 ¶
NotBlank와 같은 일부 제약 조건은 더 간단하지만 Choice 제약 조건과 같은 다른 제약 조건에는 사용 가능한 많은 구성 옵션이 있습니다. Author
클래스에 "남성", "여성" 또는 "기타"로 설정할 수 있는 gender
라는 또 다른 속성이 있다고 가정합니다. Author
类有另外一个属性叫 gender
,该属性可以被设置为“male”、“female” 或 “other”:
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)) ); }}
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="firstName"> <constraint name="NotBlank" /> <constraint name="Length"> <option name="min">3</option> </constraint> </property> </class></constraint-mapping>
YAML:# src/AppBundle/Resources/config/validation.ymlAppBundle\Entity\Author: properties: firstName: - NotBlank: ~ - Length: min: 3
Annotations:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Constraints as Assert; class Author{ /** * @Assert\NotBlank() * @Assert\Length(min=3) */ private $firstName;}
约束的选项始终可以通过一个数组来传递的。有些约束也允许你传入一个 ”default” 选项的值来代替这个数组。在 Choice
约束中,choices
选项就可以通过这种方式指定。
PHP:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Mapping\ClassMetadata;use Symfony\Component\Validator\Constraints as Assert; class Author{ public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addGetterConstraint('passwordLegal', new Assert\IsTrue(array( 'message' => 'The password cannot match your first name', ))); }}
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"> <getter property="passwordLegal"> <constraint name="IsTrue"> <option name="message">The password cannot match your first name</option> </constraint> </getter> </class></constraint-mapping>
YAML:# src/AppBundle/Resources/config/validation.ymlAppBundle\Entity\Author: getters: passwordLegal: - 'IsTrue': { message: 'The password cannot match your first name' }
Annotations:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Constraints as Assert; class Author{ /** * @Assert\IsTrue(message = "The password cannot match your first name") */ public function isPasswordLegal() { // ... return true or false }}
这纯粹是为了让最常见的配置选项在用起来时更加的简单快速。
如果你不确定如何指定一个选项,要么去查看API文档,要么为了保险起见,通过一个选项数组来传入(即上面第一种方式)。
约束的目标 ¶
约束可以被应用到类的属性(如 name
)或者一个公共的getter方法(如 getFullName
)乃至整个类上。属性约束最常用也最简单,而Getter约束则允许你指定更加复杂的验证规则。最后,如果,类约束的使用场景是,你要将类作为整体进行验证。
属性约束 ¶
类属性的验证是一个最基本的验证技巧。Symfony允许你校验 private, protected 或者 public 属性。下面代码展示了如何配置 Author
对象的 $firstName
public function isPasswordLegal(){ return $this->firstName !== $this->password;}rrreeerrreeerrreee 제한된 옵션 항상 배열을 통해 전달될 수 있습니다. 일부 제약 조건에서는 이 배열 대신 "기본" 옵션 값을 전달할 수도 있습니다.
Choice
제약 조건에서 choices
옵션은 이런 방식으로 지정할 수 있습니다. 🎜rrreeerrreeerrreee🎜rrreee🎜🎜이는 순전히 가장 일반적인 구성 옵션을 더 쉽고 빠르게 사용할 수 있도록 하기 위한 것입니다. 🎜🎜옵션을 지정하는 방법을 잘 모르는 경우 API 문서를 확인하거나 안전을 위해 옵션 배열을 통해 옵션을 전달하세요(예: 위의 첫 번째 방법). 🎜제약조건의 목표 ¶🎜
🎜제약조건은 클래스 속성(예:name
) 또는 공개 getter 메소드(예: getFullName
) 또는 전체 클래스. 속성 제약 조건은 가장 일반적으로 사용되며 간단한 반면, Getter 제약 조건을 사용하면 보다 복잡한 유효성 검사 규칙을 지정할 수 있습니다. 마지막으로, 클래스 제약 조건의 사용 사례가 클래스 전체를 확인하려는 경우입니다. 🎜🎜속성 제약 조건 ¶🎜🎜🎜클래스 속성 확인은 가장 기본적인 확인 기술 중 하나입니다. Symfony를 사용하면 개인, 보호 또는 공공 자산을 확인할 수 있습니다. 다음 코드는 Author
개체의 $firstName
속성을 구성하여 3자 이상이 되도록 구성하는 방법을 보여줍니다. 🎜rrreeerrreeerrreee🎜rrreee🎜Getters 제약 조건 ¶
제약 조건은 메서드의 반환 값에도 적용될 수 있습니다. Symfony를 사용하면 "get", "is" 또는 "has"로 시작하는 모든 공개 메서드에 제약 조건을 추가할 수 있습니다. 이러한 유형의 메소드를 "getters"라고 합니다.
이 기술의 장점은 개체의 유효성을 동적으로 확인할 수 있다는 것입니다. 예를 들어 보안상의 이유로 비밀번호 필드가 사용자의 이름과 일치하지 않도록 하려고 한다고 가정해 보겠습니다. isPasswordLegal
메서드를 생성한 다음 해당 메서드가 true
를 반환해야 한다고 주장하면 됩니다. isPasswordLegal
方法,然后断言该方法必须返回 true
来实现:
现在,创建一个 isPasswordLegal()
方法,含有你所需的逻辑:
眼尖的人可能会注意到,在YAML, XML和PHP的约束配置格式中,getter的前缀(“get”、”is” 或者 “has”) 在映射时被忽略了。这能让你在不改变验证逻辑的前提下,把一个约束移动到后面的一个同名属性之上(反之亦然)。
类约束 ¶
有一些约束可以应用到被验证的整个类。例如,Callback 类型的约束,就是一个可以作用到类本身的通用约束。当类被验证时,约束所指定的方法将被直接执行,以便提供更多的自定义验证。
总结 ¶
Symfony的 validator
rrreeerrreeerrreeerrreee
isPasswordLegal()
을 생성하세요. 필요한 로직이 포함된 메소드:🎜🎜클래스 제약 ¶🎜🎜🎜검증 대상 클래스 전체에 적용할 수 있는 몇 가지 제약이 있습니다. 예를 들어 Callback🎜 유형 제약 조건은 클래스 자체에 적용할 수 있는 일반적인 제약 조건입니다. 클래스의 유효성이 검사되면 제약 조건에 지정된 메서드가 직접 실행되어 더 많은 사용자 정의 유효성 검사를 제공합니다. 🎜🎜요약 ¶🎜🎜🎜Symfony의
validator
(검증)는 사용할 수 있는 강력한 도구입니다. 어떤 객체의 데이터. 그 힘은 객체 속성과 getter 메서드에 적용할 수 있는 제약 조건에서 비롯됩니다. 대부분의 경우 유효성 검사 프레임워크는 양식을 사용할 때 간접적으로 적용되지만 개체의 유효성을 검사하기 위해 어디에서나 사용할 수 있다는 점을 기억하세요. 🎜🎜🎜🎜🎜🎜🎜🎜