확인


검증은 웹 프로그램에서 매우 일반적인 작업입니다. 양식에 입력된 데이터에는 유효성 검사가 필요합니다. 또한 데이터베이스에 기록되거나 웹 서비스로 전송될 때 데이터의 유효성을 검사해야 합니다.

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>

Protected 및 private 속성과 "getter" 메소드도 확인할 수 있습니다(제한된 전달 범위
참조).

인증 서비스 이용

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>
다음으로 저자를 실제로 인증해야 합니다. 개체, validator 서비스 사용(Validator 클래스)이 반환됩니다. 다음 간단한 예를 컨트롤러에 구현하세요. $name 속성이 비어 있으면 오류 메시지가 표시됩니다.
🎜🎜🎜
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 属性插入一个值,令人高兴的成功信息就会出现。

你也可以传递“错误信息集合”(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 프로그램에서 메서드의 반환 값입니다.

문자열 제약 조건

숫자 제약 조건

비교 제약 조건

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;}
rrreeerrreee

rrreee
제한된 옵션 항상 배열을 통해 전달될 수 있습니다. 일부 제약 조건에서는 이 배열 대신 "기본" 옵션 값을 전달할 수도 있습니다. 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 来实现:

rrreeerrreeerrreeerrreee

现在,创建一个 isPasswordLegal() 方法,含有你所需的逻辑:

rrreee


眼尖的人可能会注意到,在YAML, XML和PHP的约束配置格式中,getter的前缀(“get”、”is” 或者 “has”) 在映射时被忽略了。这能让你在不改变验证逻辑的前提下,把一个约束移动到后面的一个同名属性之上(反之亦然)。


类约束 

有一些约束可以应用到被验证的整个类。例如,Callback 类型的约束,就是一个可以作用到类本身的通用约束。当类被验证时,约束所指定的方法将被直接执行,以便提供更多的自定义验证。

总结 

Symfony的 validatorrrreeerrreeerrreeerrreee

이제 isPasswordLegal()을 생성하세요. 필요한 로직이 포함된 메소드:
rrreee

눈썰미가 있는 사람은 제약 조건 구성 형식이 YAML, XML 및 PHP에서는 매핑 시 getter 접두사("get", "is" 또는 "has")가 무시됩니다. 이를 통해 유효성 검사 논리를 변경하지 않고도 제약 조건을 동일한 이름의 후속 속성으로 이동할 수 있습니다(또는 그 반대로).

🎜🎜클래스 제약 ¶🎜🎜🎜검증 대상 클래스 전체에 적용할 수 있는 몇 가지 제약이 있습니다. 예를 들어 Callback🎜 유형 제약 조건은 클래스 자체에 적용할 수 있는 일반적인 제약 조건입니다. 클래스의 유효성이 검사되면 제약 조건에 지정된 메서드가 직접 실행되어 더 많은 사용자 정의 유효성 검사를 제공합니다. 🎜🎜요약 ¶🎜🎜🎜Symfony의 validator(검증)는 사용할 수 있는 강력한 도구입니다. 어떤 객체의 데이터. 그 힘은 객체 속성과 getter 메서드에 적용할 수 있는 제약 조건에서 비롯됩니다. 대부분의 경우 유효성 검사 프레임워크는 양식을 사용할 때 간접적으로 적용되지만 개체의 유효성을 검사하기 위해 어디에서나 사용할 수 있다는 점을 기억하세요. 🎜🎜🎜🎜🎜🎜🎜🎜