Symfony - Validación

La validación es el aspecto más importante al diseñar una aplicación. Valida los datos entrantes. Este capítulo explica en detalle la validación de formularios.

Restricciones de validación

El validador está diseñado para validar objetos frente a restricciones. Si valida un objeto, simplemente asigne una o más restricciones a su clase y luego páselo al servicio de validación. De forma predeterminada, al validar un objeto, se comprobarán todas las restricciones de la clase correspondiente para ver si se cumplen o no. Symfony admite las siguientes restricciones de validación notables.

NotBlank

Valida que una propiedad no esté en blanco. Su sintaxis es la siguiente:

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

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

Esta restricción NotBlank asegura que la propiedad studentName no debe estar en blanco.

No nulo

Valida que un valor no es estrictamente igual a nulo. Su sintaxis es la siguiente:

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

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

Email

Valida que un valor sea una dirección de correo electrónico válida. Su sintaxis es la siguiente:

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

Es nulo

Valida que un valor sea exactamente igual a nulo. Su sintaxis es la siguiente:

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

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

Longitud

Valida que una longitud de cadena determinada esté entre un valor mínimo y máximo. Su sintaxis es la siguiente:

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

Rango

Valida que un número dado está entre un número mínimo y máximo. Su sintaxis es la siguiente:

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

Fecha

Valida que un valor sea una fecha válida. Sigue un formato válido AAAA-MM-DD. Su sintaxis es la siguiente:

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

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

Elección

Esta restricción se usa para asegurar que el valor dado sea uno de un conjunto dado de opciones válidas. También se puede utilizar para validar que cada elemento de una matriz de elementos es una de esas opciones válidas. Su sintaxis es la siguiente:

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

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

Contraseña de usuario

Esto valida que un valor de entrada sea igual a la contraseña del usuario autenticado actual. Esto es útil en un formulario en el que los usuarios pueden cambiar su contraseña, pero necesitan ingresar su contraseña anterior por seguridad. Su sintaxis es la siguiente:

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

Esta restricción valida que la contraseña anterior coincida con la contraseña actual del usuario.

Ejemplo de validación

Escribamos un ejemplo de aplicación simple para comprender el concepto de validación.

Step 1 - Cree una aplicación de validación.

Crea una aplicación Symfony, validationsample, usando el siguiente comando.

symfony new validationsample

Step 2 - Crea una entidad nombrada, FormValidation en archivo “FormValidation.php” bajo la “src/AppBundle/Entity/”directorio. Agregue los siguientes cambios en el archivo.

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 - Crea un validateActionmétodo en StudentController. Mover al directorio“src/AppBundle/Controller”, crear “studentController.php” archivo y agregue el siguiente código en él.

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

Aquí, hemos creado el formulario usando clases de formulario y luego manejamos el formulario. Si el formulario se envía y es válido, se muestra un mensaje de formulario validado. De lo contrario, se muestra el formulario predeterminado.

Step 4- Cree una vista para la acción creada anteriormente en StudentController. Mover al directorio“app/Resources/views/student/”. Crear“validate.html.twig” archivo y agregue el siguiente código en él.

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

Aquí, hemos utilizado etiquetas de formulario para crear el formulario.

Step 5 - Finalmente, ejecute la aplicación, http://localhost:8000/student/validate.

Resultado: página inicial

Resultado: Página final