Учебники

Symfony — валидация

Валидация является наиболее важным аспектом при разработке приложения. Он проверяет поступающие данные. В этой главе подробно описывается проверка формы.

Ограничения валидации

Валидатор предназначен для проверки объектов на соответствие ограничениям. Если вы проверяете объект, просто сопоставьте одно или несколько ограничений его классу, а затем передайте его в службу проверки. По умолчанию при проверке объекта будут проверяться все ограничения соответствующего класса, чтобы увидеть, действительно ли они проходят. Symfony поддерживает следующие известные ограничения проверки.

NotBlank

Проверяет, что свойство не пустое. Его синтаксис выглядит следующим образом —

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

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

Это ограничение NotBlank гарантирует, что свойство studentName не должно быть пустым.

Ненулевой

Проверяет, что значение не строго равно нулю. Его синтаксис выглядит следующим образом —

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

Нулевой

Проверяет, что значение точно равно нулю. Его синтаксис выглядит следующим образом —

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

Дата

Проверяет, что значение является действительной датой. Это соответствует действительному формату ГГГГ-ММ-ДД. Его синтаксис выглядит следующим образом —

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, пример проверки , используя следующую команду.

symfony new validationsample 

Шаг 2 — Создайте сущность с именем FormValidation в файле «FormValidation.php» в каталоге «src / AppBundle / Entity /» . Добавьте следующие изменения в файл.

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 — Создайте метод validateAction в StudentController. Перейдите в каталог «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 .