Pengesahan


Pengesahan ialah tugas yang sangat biasa dalam program web. Data yang dimasukkan dalam borang memerlukan pengesahan. Data juga perlu disahkan apabila ditulis ke pangkalan data atau dipindahkan ke perkhidmatan web.

Symfony disertakan dengan komponen Validator, yang menjadikan pengesahan berfungsi mudah dan telus. Komponen ini adalah berdasarkan JSR303 Spesifikasi Pengesahan Kacang.

Asas pengesahan

Cara terbaik untuk memahami pengesahan ialah melihatnya dalam tindakan. Sebelum kita bermula, mari kita anggap bahawa anda mencipta objek PHP asli yang digunakan di tempat yang diperlukan oleh program anda: Tujuan pengesahan adalah untuk memberitahu anda sama ada data dalam objek itu sah. Untuk melakukan ini, anda perlu mengkonfigurasi senarai peraturan (dipanggil

constraints/constraints

) yang objek mesti ikut supaya sah. Peraturan ini boleh ditentukan dalam beberapa format yang berbeza (YAML, XML, anotasi atau PHP).
Sebagai contoh, untuk memastikan atribut $name tidak kosong, tambah kandungan berikut:

// src/AppBundle/Entity/Author.phpnamespace AppBundle\Entity; class Author{
    public $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: ~

$name 不为空,添加以下内容:

Annotations:// src/AppBundle/Entity/Author.php // ...use Symfony\Component\Validator\Constraints as Assert; class Author{
    /**
     * @Assert\NotBlank()
     */
    public $name;}
// ...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!');}
1
2
AppBundle\Author.name:
  This value should not be blank

Protected和private属性以及“getter”方法也可以被验证(见 约束的投放范围)。

使用验证服务 

接下来,要真正的校验 Author 对象,使用 validator 服务(Validator 类)的 validate 方法。 validator 的工作很简单:读取一个类的约束规则来校验对象数据是否满足这些约束。如果验证失败,一个非空的错误列表(ConstraintViolationList类)将被返回。在控制器中实践这个简单例子:

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

如果 $nameProperti yang dilindungi dan persendirian serta kaedah "getter" juga boleh disahkan (lihat < a href="#catalog16">Julat penghantaran yang dikekang
).

Jika anda memasukkan nilai untuk atribut name, mesej kejayaan yang menggembirakan akan muncul. name 属性插入一个值,令人高兴的成功信息就会出现。

你也可以传递“错误信息集合”(collection of errors)到模版中:

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 }


每一个验证错误(被称为“constraint violation/约束违反”)都由一个 ConstraintViolation

Kebanyakan masa, anda tidak perlu menghubungi validator perkhidmatan secara langsung Interaktif, atau jangan risau tentang mengeluarkan mesej ralat. Dalam kebanyakan kes, anda menggunakan pengesahan secara tidak langsung semasa memproses data borang yang diserahkan. Lihat Pengesahan dan Borang
untuk mengetahui lebih lanjut.

Anda juga boleh menghantar "koleksi ralat" ke templat:

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.',
        )));
    }}

Dalam templat, anda boleh Perlu mengeluarkan ralat senaraikan dengan tepat:

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. }
        # ...

#🎜🎜#
#🎜🎜#Setiap ralat pengesahan (dipanggil "pelanggaran kekangan/pelanggaran kekangan") diwakili oleh ConstraintViolation#🎜🎜# objek untuk dipaparkan. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Konfigurasi #🎜🎜#¶#🎜🎜##🎜🎜##🎜🎜#Pengesah Symfony didayakan secara lalai, tetapi jika anda menentukannya anotasi (untuk pengesahan) mesti didayakan secara eksplisit: #🎜🎜#
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'))
        );
    }}
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>
#🎜🎜##🎜🎜##🎜🎜##🎜🎜#

Peraturan kekangan

Validator 被设计成针对 约束(即规则)来验证对象。要验证一个对象,只需把一或多个约束映射到它要验证的类,然后再把它传递给 validator Layan saja.

Di sebalik tabir, kekangan ialah objek PHP yang menjana pernyataan untuk membuat keputusan. Dalam amalan, kekangan boleh menjadi "kek tidak boleh hangus". Dalam Symfony, kekangan adalah serupa: ia adalah penegasan tentang sama ada keadaan adalah benar. Memandangkan nilai, kekangan memberitahu anda sama ada nilai itu mematuhi peraturan kekangan anda. #🎜🎜 ## 🎜🎜#Kekangan yang disokong

¶#🎜🎜 ## 🎜🎜 ## 🎜🎜#Symfony merangkumi banyak kekangan yang paling biasa digunakan:#🎜🎜 ## 🎜🎜#Kekangan asas#🎜🎜 #¶

Ini adalah kekangan asas: gunakannya untuk menegaskan perkara yang sangat asas tentang nilai harta, atau untuk menegaskan nilai pulangan kaedah dalam program anda.

E-mel

Kekangan Perbandingan

¶Bersamaan

IdenticalTo

Kekangan Koleksi

Negara

Imej

    Issn
  • Lain-lain kekangan
  • Sah
  • Anda juga boleh mencipta Define anda sendiri kekangan. Artikel Cara membuat kekangan pengesahan tersuai
  • merangkumi topik ini.
  • Konfigurasi kekangan

    Sesetengah kekangan, seperti NotBlank adalah lebih mudah, manakala yang lain, seperti Choice kekangan, mempunyai banyak pilihan konfigurasi yang tersedia. Anggapkan bahawa kelas Author mempunyai atribut lain yang dipanggil jantina, yang boleh ditetapkan kepada "lelaki", "perempuan" atau "lain": Author 类有另外一个属性叫 gender,该属性可以被设置为“male”、“female” 或 “other”:

    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;     // ...}
    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>

    约束的选项始终可以通过一个数组来传递的。有些约束也允许你传入一个 ”default” 选项的值来代替这个数组。在 Choice 约束中,choices 选项就可以通过这种方式指定。

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

    这纯粹是为了让最常见的配置选项在用起来时更加的简单快速。

    如果你不确定如何指定一个选项,要么去查看API文档,要么为了保险起见,通过一个选项数组来传入(即上面第一种方式)。

    约束的目标 

    约束可以被应用到类的属性(如 name)或者一个公共的getter方法(如 getFullName)乃至整个类上。属性约束最常用也最简单,而Getter约束则允许你指定更加复杂的验证规则。最后,如果,类约束的使用场景是,你要将类作为整体进行验证。

    属性约束 

    类属性的验证是一个最基本的验证技巧。Symfony允许你校验 private, protected 或者 public 属性。下面代码展示了如何配置 Author 对象的 $firstName

    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
        }}
    public function isPasswordLegal(){
        return $this->firstName !== $this->password;}

    rrreee
    terhalang Pilihan sentiasa boleh dihantar melalui tatasusunan. Sesetengah kekangan juga membenarkan anda menghantar nilai untuk pilihan "lalai" sebagai ganti tatasusunan ini. Dalam kekangan Choice, pilihan choice boleh ditentukan dengan cara ini. 🎜rrreeerrreeerrreee🎜rrreee🎜🎜Ini semata-mata untuk menjadikan pilihan konfigurasi yang paling biasa lebih mudah dan lebih pantas untuk digunakan. 🎜🎜Jika anda tidak pasti cara untuk menentukan pilihan, sama ada semak dokumentasi API atau hanya untuk berada di bahagian selamat, hantarkannya melalui tatasusunan pilihan (iaitu cara pertama di atas). 🎜

    Matlamat kekangan ¶🎜

    🎜Kekangan boleh digunakan pada atribut kelas (seperti nama
    ) atau kaedah pengambil awam (seperti getFullName) atau malah keseluruhan kelas. Kekangan atribut adalah yang paling biasa digunakan dan paling mudah, manakala kekangan Getter membolehkan anda menentukan peraturan pengesahan yang lebih kompleks. Akhir sekali, jika kes penggunaan untuk kekangan kelas ialah anda ingin mengesahkan kelas secara keseluruhan. 🎜🎜Kekangan atribut ¶🎜🎜🎜Pengesahan atribut kelas ialah salah satu teknik pengesahan yang paling asas. Symfony membolehkan anda mengesahkan harta peribadi, dilindungi atau awam. Kod berikut menunjukkan cara untuk mengkonfigurasi sifat $firstName objek Author supaya ia mempunyai sekurang-kurangnya 3 aksara: 🎜rrreeerrreeerrreee🎜rrreee🎜

    GettersConstraints

    Constraints juga boleh digunakan pada nilai pulangan sesuatu kaedah. Symfony membenarkan anda menambah kekangan pada mana-mana kaedah awam yang bermula dengan "dapat", "adalah" atau "ada". Kaedah jenis ini dipanggil "getters".

    Faedah teknik ini ialah ia membolehkan anda mengesahkan objek anda secara dinamik. Sebagai contoh, katakan anda ingin memastikan bahawa medan kata laluan tidak sepadan dengan nama pertama pengguna (atas sebab keselamatan). Anda boleh melakukan ini dengan mencipta kaedah isPasswordLegal dan kemudian menegaskan bahawa kaedah tersebut mesti mengembalikan true:isPasswordLegal 方法,然后断言该方法必须返回 true 来实现:

    rrreeerrreeerrreeerrreee

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

    rrreee


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


    类约束 

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

    总结 

    Symfony的 validatorrrreeerrreeerrreeerrreee

    Sekarang, buat isPasswordLegal ( ) kaedah, mengandungi logik yang anda perlukan:
    rrreee

    Orang bermata helang mungkin menyedari bahawa dalam format konfigurasi kekangan YAML, XML dan PHP, awalan pengambil ("dapat", "adalah" atau "ada") diabaikan semasa memetakan. Ini membolehkan anda mengalihkan kekangan ke sifat seterusnya dengan nama yang sama (dan sebaliknya) tanpa mengubah logik pengesahan.

#🎜🎜##🎜🎜#Kekangan kelas ¶#🎜🎜# #🎜🎜##🎜🎜#Terdapat beberapa kekangan yang boleh digunakan untuk keseluruhan kelas yang disahkan. Contohnya, kekangan jenis Panggil balik#🎜🎜# ialah kekangan umum yang boleh digunakan pada kelas itu sendiri. Apabila kelas disahkan, kaedah yang ditentukan oleh kekangan akan dilaksanakan secara langsung untuk memberikan lebih banyak pengesahan tersuai. #🎜🎜##🎜🎜#Ringkasan ¶#🎜🎜##🎜🎜##🎜🎜#Symfony's validator (Pengesahan) ialah alat berkuasa yang boleh digunakan untuk memastikan kesahihan data pada sebarang objek. Kuasanya datang daripada kekangan, yang boleh anda gunakan pada sifat objek dan kaedah pengambil. Walaupun, dalam kebanyakan kes, rangka kerja pengesahan digunakan secara tidak langsung apabila menggunakan borang, ingat, ia boleh digunakan di mana-mana sahaja untuk mengesahkan sebarang objek. #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#