Analyse de la méthode de vérification des données Symfony

不言
Libérer: 2023-03-22 17:28:01
original
1341 Les gens l'ont consulté

Cet article utilise des exemples pour analyser la méthode de vérification des données Symfony. Il est partagé ici pour votre référence. Les amis intéressés peuvent jeter un œil à


La vérification est une tâche courante. dans les applications Web. Les données saisies dans le formulaire doivent être validées. Les données doivent également être vérifiées avant d'être écrites dans la base de données ou lorsqu'elles sont transmises à un service Web.

Symfony2 est équipé d'un composant Validator, qui rend le travail de vérification simple et facile à comprendre. Ce composant est basé sur la spécification de validation JSR303 Bean. Une spécification Java à utiliser en PHP.

Validation de base

La meilleure façon de comprendre la validation est de voir comment elle fonctionne. Tout d’abord, supposons que vous avez créé un objet PHP utilisé quelque part dans votre application.

Le code est le suivant :

//src/Acme/BlogBundle/Entity/Author.php
namespace Acme\BlogBundle\Entity;
class Author
{
public $name;
}
Copier après la connexion


Jusqu'à présent, il s'agit simplement d'une classe ordinaire qui sert à un certain objectif de votre application . Le but de la vérification est de vous indiquer si les données de l'objet sont licites. Pour cela, vous devez configurer un objet pour qu'il suive une liste de règles ou de contraintes afin de rendre ses données légales. Ces règles peuvent être décrites dans de nombreux formats différents (par exemple, YAML, XML, déclarations de classe ou PHP). Par exemple, nous veillons à ce que l'attribut $name ne puisse pas être vide, ajoutez donc la règle suivante :

Format YAML :

Le code est le suivant :

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
properties:
name:
- NotBlank: ~
Copier après la connexion


Format de déclaration de classe :

Le code est le suivant :

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;
class Author
{
/**
* @Assert\NotBlank()
*/
public $name;
}
Copier après la connexion

Format XML :

Le code est le suit :

<?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">
Copier après la connexion
Copier après la connexion

Format du code PHP :

Le code est le suivant :

// src/Acme/BlogBundle/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(&#39;name&#39;, new NotBlank());
}
}
Copier après la connexion

Les attributs protégés et privés et les méthodes getter peuvent également être vérifiés .

Utilisez le service de validation :

Ensuite, utilisez la méthode de validation du service de validation pour vérifier réellement l'objet Auteur. Le travail du validateur est simple : lire les règles de contraintes d'une classe pour vérifier si les données d'un objet sont conformes à ces règles de contraintes. Si la validation échoue, un tableau d'erreurs sera renvoyé. Maintenant on l'exécute dans un contrôleur :

Le code est le suivant :

use Symfony\Component\HttpFoundation\Response;
use Acme\BlogBundle\Entity\Author;
//...
public function indexAction()
{
$author = new Author();
//... 对$auother对象做些什么

$validator = $this->get(&#39;validator&#39;);
$errors = $validator->validate($author);
if(count($errors) >0){
return new Response(print_r($errors, true));
}else{
return new Response(&#39;The author is valid! Yes!&#39;);
}
}
Copier après la connexion


Si l'attribut $name est vide, vous verra au message d'erreur suivant :

AcmeBlogBundleAuthor.name:
Cette valeur ne doit pas être vide

Si vous insérez une valeur pour l'attribut $name, vous obtiendrez un message heureux message de réussite.

La plupart du temps, vous n'avez pas besoin de communiquer directement avec le service de validation ni de vous soucier des erreurs d'impression.

La plupart du temps, vous utiliserez la validation indirectement lors du traitement des données du formulaire soumis.

Vous pouvez également transmettre un ensemble de messages d'erreur à un modèle :

Le code est le suivant :

if(count($errors)>0){
return $this->render(&#39;AcmeBlogBundle:Author:validate.html.twig&#39;,array(
&#39;errors&#39; => $errors,
));
}else{
//...
}
Copier après la connexion


Dans le modèle, vous pouvez afficher la liste d'erreurs aussi précisément que nécessaire :

Format de brindille :

Le code est le suivant :

{# src/Acme/BlogBundle/Resources/views/Author/validate.html.twig #}
The author has the following errros
{% for error in errors %}
{{ error.message }}
{% endfor %}
Copier après la connexion

Formulaire de somme de contrôle

Le service de validation peut être utilisé pour vérifier n'importe quel objet à tout moment. En fait, vous utiliserez souvent des validateurs indirectement lors du traitement des formulaires. La bibliothèque de formulaires de Symfony utilise indirectement le service de validation pour valider les objets sous-jacents une fois les données soumises et liées. Les informations de violation de contrainte d'objet seront converties en un objet FieldError, qui peut être facilement affiché dans votre formulaire. Le processus traditionnel de soumission de formulaire dans un contrôleur est le suivant :

Le code est le suivant :

use Acme\BlogBundle\Entity\Author;
use Acme\BlogBundle\Form\AuthorType;
use Acme\Component\HttpFoundation\Request;
//...
public function updateAction(Request $request)
{
$author = new Acme\BlogBundle\Entity\Author();
$form = $this->createForm(new AuthorType(),$author);
if($request->getMethod() ==&#39;POST&#39;){
$form->bindRequest($request);

if($form->isvalid()){
//对$author做一些操作
return $this->redirect($this->generateUrl(&#39;...&#39;));
}
}
return $this->render(&#39;BlogBundle:Author:form.html.twig&#39;,array(
&#39;form&#39; => $form->createView(),
));
}
Copier après la connexion

Configuration :

Le validateur de Symfony2 est disponible par défaut. Mais si vous utilisez la méthode life pour spécifier vos contraintes, alors vous devez activer explicitement la fonction de déclaration :

Format YAML :

Le code est le suivant :

# app/config/config.yml
framework:
validation: {enable_annotations: true }
Copier après la connexion

Format XML :

Le code est le suivant :





Format du code PHP :

Le code est le suivant :

// app/config/config.php
$contianer->loadFromExtension(&#39;framework&#39;,array(&#39;validation&#39;=> array(
&#39;enable_annotations&#39;=>true,
)));
Copier après la connexion

Règles de contrainte

Validator est conçu pour vérifier des objets selon des règles de contrainte. Pour valider un objet, mappez simplement une ou plusieurs contraintes à la classe qu'il valide et transmettez-la au service de validation.

Essentiellement, une contrainte est un simple objet PHP qui génère une déclaration de décision. Dans la vraie vie, une contrainte peut être une contrainte de règle du type « le gâteau ne peut pas être brûlé ». Dans Symfony2, les contraintes sont toutes les mêmes : elles déterminent si une certaine condition est vraie. Étant donné une valeur, la contrainte vous indique si la valeur obéit à vos règles de contrainte.

Règles de contrainte supportées par Symfony2

Il y a d'abord les règles de contrainte de base : utilisez-les pour déterminer des choses très basiques, comme la valeur des propriétés de votre objet ou la valeur de retour d'une méthode.

NotBlank, Blank, NotNull, Null, True, False, Type

Contraintes de chaîne : Email, MinLength, MaxLength, Url, Regex, Ip, etc.
Contraintes numériques : Max, Min
Contraintes de date : Date, DateHeure et Heure

Contraintes de collection : Choix, Collection, UniqueEntity, Langue, Paramètres régionaux et Pays, etc.
Contraintes de fichier : Fichier, Image
Autres contraintes : Rappel, Tout, Valide

Vous pouvez également créer vos propres contraintes personnalisées.

Configuration des contraintes :

Certaines contraintes, comme NotBlank, sont très simples, mais d'autres, comme les contraintes Choice, ont de nombreux éléments de configuration qui doivent être définis. En supposant que la classe Author a un autre attribut, gener peut être défini sur "male" ou "female" :

Format YAML :

Le code est le suivant :

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
properties:
gener:
- Choice: { choices: [male, female], message: Choos a valid gender. }
Copier après la connexion


Format de déclaration de classe :

Le code est le suivant :

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;
class Author
{
/**
* @Assert\Choice(
* choices = {"male","female"},
* message = "Choose a valid gender."
* )
*/
public $gender;
}
Copier après la connexion


Format XML :

Le code est le suivant :

<?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">
Copier après la connexion
Copier après la connexion

Format du code PHP :

Le code est le suivant :

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
class Author
{
public $gender;
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint(&#39;gender&#39;, new Choice(array(
&#39;choices&#39; => array(&#39;male&#39;, &#39;female&#39;),
&#39;message&#39; => &#39;Choose a valid gender.&#39;,
)));
}
}
Copier après la connexion

一个约束的选项通常都是通过一个数组来传递的。有些约束也允许你传递一个值。"default"在数组中是可选的。在Choice约束时,choices选项就可以通过这种方式指定。

YAML格式:

代码如下:

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
properties:
gender:
- Choice: [male, female]
Copier après la connexion

类声明格式:

代码如下:

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;
class Author
{
/**
* @Assert\Choice({"male", "female"})
*/
protected $gender;
}
Copier après la connexion

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">
male
female
Copier après la connexion

PHP格式:

代码如下:

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\Choice;
class Author
{
protected $gender;
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint(&#39;gender&#39;, new Choice(array(&#39;male&#39;, &#39;female&#39;)));
}
}
Copier après la connexion


约束目标

约束可以被用于一个类的属性或者一个公共的getter方法。属性约束最常用也最简单,而公共的getter方法约束则允许你指定一个复杂的约束规则。

属性约束:

校验类的属性石一个最常规的校验技术。Symfony2允许你校验private,protected或者public属性。下面代码显示如何配置Author对象的$firstName属性至少有3个字符:

YAML格式:

代码如下:

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
properties:
firstName:
- NotBlank: ~
- MinLength: 3
Copier après la connexion


类声明格式:

代码如下:

// Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;
class Author
{
/**
* @Assert\NotBlank()
* @Assert\MinLength(3)
*/
private $firstName;
}
Copier après la connexion


XML格式:

代码如下:





3


PHP代码格式:

代码如下:

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\MinLength;
class Author
{
private $firstName;
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint(&#39;firstName&#39;, new NotBlank());
$metadata->addPropertyConstraint(&#39;firstName&#39;, new MinLength(3));
}
}
Copier après la connexion

Getters

约束也可以应用于一个方法的返回值。Symfony2 允许你添加一个约束到任何"get"或者 "is"开头的public方法。该技术的好处是允许你动态的校验你的对象。比如,假设你想确认密码字段不匹配用户的first name(因为安全原因)。你可以通过创建一个idPasswordLegal 方法,然后决断这个方法必须返回true:

YAML格式:

代码如下:

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
getters:
passwordLegal:
- "True": { message: "The password cannot match your first name" }
Copier après la connexion

类声明格式:

代码如下:

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;
class Author
{
/**
* @Assert\True(message = "The password cannot match your first name")
*/
public function isPasswordLegal()
{
// return true or false
}
}
Copier après la connexion


XML格式:

代码如下:


PHP代码格式:

代码如下:

// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\True;
class Author
{
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addGetterConstraint(&#39;passwordLegal&#39;, new True(array(
&#39;message&#39; => &#39;The password cannot match your first name&#39;,
)));
}
}
Copier après la connexion

现在我们创建一个isPasswordLegal()方法,并且包含你需要逻辑:

代码如下:

public function isPasswordLegal()
{
return ($this->firstName != $this->password);
}
Copier après la connexion

眼尖的人可能会注意到getter的前缀("get"或者"is")在映射时被忽略了。这允许你在不改变校验规则的前提下,把一个约束移动到一个具有同名属性上,反之亦然。


类:

一些约束应用到整个类被校验上面。比如,Callback约束是一个通用约束,它可以应用到类自身。当类被校验时,被约束描述的方法只是被执行这样每一个可以提供更个性化的校验。

校验分组

到目前为止,你已经能够添加约束到类并询问是否该类传入所有定义的约束规则。一些情况下,你只需要使用该类的其中某些规则来校验一个对象。要做到这些,你可以组织每一个约束到一个或者多个校验组中,然后应用使用其中一组校验。比如,假设你有一个User类,它会在用户注册和用户更新他们的联系信息时使用。

YAML格式:

代码如下:

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\User:
properties:
email:
- Email: { groups: [registration] }
password:
- NotBlank: { groups: [registration] }
- MinLength: { limit: 7, groups: [registration] }
city:
- MinLength: 2
Copier après la connexion


类声明格式:

代码如下:

// src/Acme/BlogBundle/Entity/User.php
namespace Acme\BlogBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
class User implements UserInterface
{
/**
* @Assert\Email(groups={"registration"})
*/
private $email;
/**
* @Assert\NotBlank(groups={"registration"})
* @Assert\MinLength(limit=7, groups={"registration"})
*/
private $password;
/**
* @Assert\MinLength(2)
*/
private $city;
}
Copier après la connexion

XML格式:

代码如下:

7

PHP代码格式:

代码如下:

// src/Acme/BlogBundle/Entity/User.php
namespace Acme\BlogBundle\Entity;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\MinLength;
class User
{
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint(&#39;email&#39;, new Email(array(
&#39;groups&#39; => array(&#39;registration&#39;)
)));
$metadata->addPropertyConstraint(&#39;password&#39;, new NotBlank(array(
&#39;groups&#39; => array(&#39;registration&#39;)
)));
$metadata->addPropertyConstraint(&#39;password&#39;, new MinLength(array(
&#39;limit&#39; => 7,
&#39;groups&#39; => array(&#39;registration&#39;)
)));
$metadata->addPropertyConstraint(&#39;city&#39;, new MinLength(3));
}
}
Copier après la connexion

这里我们配置了两个校验组:
default默认组: 包括所有没有分配到任何组的约束规则
registration: 只包含了email和password字段的校验规则

告诉validator使用指定的校验组,传一个或者多个组名作为validate()方法的第二个参数即可:

代码如下:

$errors = $validator->validate($author,array(&#39;registration&#39;));
Copier après la connexion

值和数组校验

到目前为止,我们已经看了如何校验整个对象。但是有时候,我们可能想值校验一个单独的值,比如校验一个字符串是不是一个合法的email地址。这非常简单,在Controller类中进行如下:

代码如下:

// 在controller类前引用相应的校验命名空间
use Symfony\Component\Validator\Constraints\Email;
public function addEmailAction($email)
{
$emailConstraint = new Email();
// 所有的校验选项(options)都可以这样设置
$emailConstraint->message = &#39;Invalid email address&#39;;
// 使用validator来校验一个值
$errorList = $this->get(&#39;validator&#39;)->validateValue($email, $emailConstraint);
if (count($errorList) == 0) {
// 这是一个合法的email地址,可以做些什么
} else {
// 这是一个非法的email地址
$errorMessage = $errorList[0]->getMessage()
// 做一些错误处理
}
// ...
}
Copier après la connexion


通过调用validator的validateValue方法,你可以传入一个原始值和一个你要使用的校验对象。该方法会返回一个ConstraintViolationList对象,它扮演的只是一个错误信息数组的角色。集合中的每一个错误是一个ConstraintViolation对象,使用对象的getMessage方法可以获取错误信息。

总结:

Symfony2 的validator是一个强大的工具,它可以被用来保证任何对象数据的合法性。它的强大来源于约束规则,你可以把它们应用于你对象的属性和getter方法。其实,你大多数情况下都是在使用表单时,间接的应用了校验框架,记住它可以被应用于任何地方校验任何对象。

相关推荐:

Symfony查询方法小结分享

Symfony2针对输入时间进行查询实例详解

详解Symfony2框架表单的用法

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!