Symfony - Validação

A validação é o aspecto mais importante ao projetar um aplicativo. Ele valida os dados recebidos. Este capítulo explica detalhadamente a validação do formulário.

Restrições de validação

O validador é projetado para validar objetos contra restrições. Se você validar um objeto, simplesmente mapeie uma ou mais restrições para sua classe e, em seguida, passe-o para o serviço validador. Por padrão, ao validar um objeto, todas as restrições da classe correspondente serão verificadas para ver se elas realmente passam ou não. Symfony suporta as seguintes restrições de validação notáveis.

NotBlank

Valida se uma propriedade não está em branco. Sua sintaxe é a seguinte -

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

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

Essa restrição NotBlank garante que a propriedade studentName não fique em branco.

Não nulo

Valida se um valor não é estritamente igual a nulo. Sua sintaxe é a seguinte -

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

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

O email

Valida se um valor é um endereço de e-mail válido. Sua sintaxe é a seguinte -

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

É nulo

Valida se um valor é exatamente igual a nulo. Sua sintaxe é a seguinte -

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

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

comprimento

Valida se um determinado comprimento de string está entre algum valor mínimo e máximo. Sua sintaxe é a seguinte -

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

Alcance

Valida se um determinado número está entre algum número mínimo e máximo. Sua sintaxe é a seguinte -

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

Encontro

Valida se um valor é uma data válida. Ele segue um formato YYYY-MM-DD válido. Sua sintaxe é a seguinte -

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

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

Escolha

Essa restrição é usada para garantir que o valor fornecido seja um de um determinado conjunto de opções válidas. Ele também pode ser usado para validar se cada item em uma matriz de itens é uma dessas opções válidas. Sua sintaxe é a seguinte -

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

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

Senha do usuário

Isso valida que um valor de entrada é igual à senha do usuário autenticado atual. Isso é útil em uma forma em que os usuários podem alterar sua senha, mas precisam inserir a senha antiga para segurança. Sua sintaxe é a seguinte -

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

Essa restrição valida se a senha antiga corresponde à senha atual do usuário.

Exemplo de Validação

Vamos escrever um exemplo de aplicativo simples para entender o conceito de validação.

Step 1 - Crie um aplicativo de validação.

Crie um aplicativo Symfony, validationsample, usando o seguinte comando.

symfony new validationsample

Step 2 - Crie uma entidade chamada, FormValidation no arquivo “FormValidation.php” debaixo de “src/AppBundle/Entity/”diretório. Adicione as seguintes alterações no arquivo.

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

Step 3 - Crie um validateActionmétodo em StudentController. Mover para o diretório“src/AppBundle/Controller”, crio “studentController.php” arquivo e adicione o código a seguir nele.

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

Aqui, criamos o formulário usando classes de formulário e, em seguida, manipulamos o formulário. Se o formulário for enviado e for válido, uma mensagem de formulário validado será exibida. Caso contrário, o formulário padrão é mostrado.

Step 4- Crie uma visão para a ação criada acima em StudentController. Mover para o diretório“app/Resources/views/student/”. Crio“validate.html.twig” arquivo e adicione o seguinte código nele.

{% 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 %}

Aqui, usamos tags de formulário para criar o formulário.

Step 5 - Por fim, execute o aplicativo, http://localhost:8000/student/validate.

Resultado: Página Inicial

Resultado: Página Final