Symfony验证


验证是设计应用程序时最重要的方面。它验证传入的数据。本章详细解释了表单验证。

验证约束

验证程序旨在根据约束验证对象。如果您验证对象,只需将一个或多个约束映射到其类,然后将其传递给验证器服务。默认情况下,在验证对象时,将检查相应类的所有约束条件,以确定它们是否真正通过。Symfony支持以下显着的验证约束。

NotBlank

验证属性不是空白。其语法如下 -

namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;

class Student {
   /**
      * @Assert\NotBlank()
   */
   protected $studentName;
}

此NotBlank约束确保studentName属性不应为空。

NOTNULL

验证一个值不是严格等于null。其语法如下 -

namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;

class Student {
   /**
      * @Assert\NotNull()
   */
   protected $studentName;
}

电子邮件

验证值是否是有效的电子邮件地址。其语法如下 -

namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;

class Student {
   /**
      * @Assert\Email(
         * message = "The email '{{ value }}' is not a valid email.",
         * checkMX = true
      * )
   */
   protected $email;
}

一片空白

验证一个值完全等于null。其语法如下 -

namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;

class Student {
   /**
      * @Assert\IsNull()
   */
   protected $studentName;
}

长度

验证给定的字符串长度是否在某个最小值和最大值之间。其语法如下 -

namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;

class Student {
   /**
      * @Assert\Length(
         * min = 5,
         * max = 25,
         * minMessage = "Your first name must be at least {{ limit }} characters long",
         * maxMessage = "Your first name cannot be longer than {{ limit }} characters"
      * )
   */
   protected $studentName;
}

范围

验证给定的数字是否在某个最小值和最大值之间。其语法如下 -

namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Student {
   /**
      * @Assert\Range(
         * min = 40,
         * max = 100,
         * minMessage = "You must be at least {{ limit }} marks”,
         * maxMessage = "Your maximum {{ limit }} marks”
      * )
   */
   protected $marks;
}

日期

验证一个值是有效的日期。它遵循有效的YYYY-MM-DD格式。其语法如下 -

namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;

class Student {
   /**
      * @Assert\Date()
   */
   protected $joinedAt;
}

选择

该约束用于确保给定值是给定的有效选择集合之一。它也可以用来验证项目数组中的每个项目是那些有效的选择之一。其语法如下 -

namespace AppBundle\Entity;  
use Symfony\Component\Validator\Constraints as Assert;  

class Student {
   /**
      * @Assert\Choice(choices = {"male", "female"}, message = "Choose a valid gender.")
   */
   protected $gender;
}

用户密码

这验证输入值等于当前认证用户的密码。这在用户可以更改密码的表单中很有用,但需要输入旧密码以确保安全。其语法如下 -

namespace AppBundle\Form\Model;
use Symfony\Component\Security\Core\Validator\Constraints as SecurityAssert;

class ChangePassword {
   /**
      * @SecurityAssert\UserPassword(
         * message = "Wrong value for your current password"
      * )
   */
   protected $oldPassword;
}

该约束验证旧密码与用户的当前密码匹配。

验证示例

让我们编写一个简单的应用程序示例来了解验证概念。

第1步 - 创建一个验证应用程序。

使用以下命令创建Symfony应用程序 validationsample

symfony new validationsample

第2步 -创建命名实体 FormValidation 文件 “FormValidation.php”“的src /的appbundle /实体/” 目录。在文件中添加以下更改。

FormValidation.php

<?php
namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;

class FormValidation {       
   /**
      * @Assert\NotBlank()
   */
   protected $name;  

   /**
      * @Assert\NotBlank()
   */
   protected $id;  
   protected $age;  

   /**
      * @Assert\NotBlank()
   */
   protected $address;  
   public $password;

   /**
      * @Assert\Email(
         * message = "The email '{{ value }}' is not a valid email.",
         * checkMX = true
      * )
   */
   protected $email;  

   public function getName() {
      return $this->name;
   }  
   public function setName($name) {
      $this->name = $name;
   }  
   public function getId() {
      return $this->id;
   }
   public function setId($id) {
      $this->id = $id;
   }  
   public function getAge() {
      return $this->age;
   }  
   public function setAge($age) {
      $this->age = $age;
   }  
   public function getAddress() {
      return $this->address;
   }  
   public function setAddress($address) {
      $this->address = $address;
   }  
   public function getEmail() {
      return $this->email;
   }  
   public function setEmail($email) {
      $this->email = $email;
   }
}

第3步 - 在StudentController中创建一个 validateAction 方法。移动到 “src / AppBundle / Controller”目录 ,创建 “studentController.php” 文件,并在其中添加以下代码。

StudentController.php

use AppBundle\Entity\FormValidation;
/**
   * @Route("/student/validate")
*/
public function validateAction(Request $request) {
   $validate = new FormValidation();
   $form = $this->createFormBuilder($validate)
      ->add('name', TextType::class)
      ->add('id', TextType::class)
      ->add('age', TextType::class)
      ->add('address', TextType::class)
      ->add('email', TextType::class)
      ->add('save', SubmitType::class, array('label' => 'Submit'))
      ->getForm();  

   $form->handleRequest($request);  
   if ($form->isSubmitted() && $form->isValid()) {
      $validate = $form->getData();
      return new Response('Form is validated.');
   }  
   return $this->render('student/validate.html.twig', array(
      'form' => $form->createView(),
   ));
}

在这里,我们使用Form类创建了表单,然后处理了表单。如果表单已提交且有效,则会显示表单验证消息。否则,显示默认窗体。

第4步 - 在StudentController中为上面创建的操作创建一个视图。 移至目录 “app / Resources / views / student /” 。创建 “validate.html.twig” 文件并在其中添加以下代码。

{% extends 'base.html.twig' %}
{% block stylesheets %}
   <style>
      #simpleform {
         width:600px;
         border:2px solid grey;
         padding:14px;
      }  
      #simpleform label {
         font-size:14px;
         float:left;
         width:300px;
         text-align:right;
         display:block;
      }  
      #simpleform span {
         font-size:11px;
         color:grey;
         width:100px;
         text-align:right;
         display:block;
      }  
      #simpleform input {
         border:1px solid grey;
         font-family:verdana;
         font-size:14px;
         color:light blue;
         height:24px;
         width:250px;
         margin: 0 0 10px 10px;
      }  
      #simpleform textarea {
         border:1px solid grey;
         font-family:verdana;
         font-size:14px;
         color:light blue;
         height:120px;
         width:250px;
         margin: 0 0 20px 10px;
      }  
      #simpleform select {
         margin: 0 0 20px 10px;
      }  
      #simpleform button {
         clear:both;
         margin-left:250px;
         background: grey;
         color:#FFFFFF;
         border:solid 1px #666666;
         font-size:16px;
      }
   </style>
{% endblock %}  

{% block body %}
   <h3>Student form validation:</h3>
   <div id = "simpleform">
      {{ form_start(form) }}
      {{ form_widget(form) }}
      {{ form_end(form) }}
   </div>   
{% endblock %}

在这里,我们使用表单标签来创建表单。

第5步 - 最后,运行应用程序 http:// localhost:8000 / student / validate

结果:初始页面

初始页面

结果:最终页面

最后一页