Symfony - Validazione

La convalida è l'aspetto più importante durante la progettazione di un'applicazione. Convalida i dati in arrivo. Questo capitolo spiega in dettaglio la convalida del modulo.

Vincoli di convalida

Il validatore è progettato per convalidare gli oggetti rispetto ai vincoli. Se convalidi un oggetto, mappare semplicemente uno o più vincoli alla sua classe e quindi passarlo al servizio di convalida. Per impostazione predefinita, durante la convalida di un oggetto verranno controllati tutti i vincoli della classe corrispondente per vedere se passano o meno. Symfony supporta i seguenti notevoli vincoli di convalida.

NotBlank

Convalida che una proprietà non è vuota. La sua sintassi è la seguente:

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

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

Questo vincolo NotBlank garantisce che la proprietà studentName non debba essere vuota.

Non nullo

Convalida che un valore non è strettamente uguale a null. La sua sintassi è la seguente:

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

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

E-mail

Convalida che un valore è un indirizzo email valido. La sua sintassi è la seguente:

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

È zero

Convalida che un valore sia esattamente uguale a null. La sua sintassi è la seguente:

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

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

Lunghezza

Convalida che una data lunghezza di stringa sia compresa tra un valore minimo e massimo. La sua sintassi è la seguente:

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

Gamma

Convalida che un dato numero è compreso tra un numero minimo e uno massimo. La sua sintassi è la seguente:

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

Data

Convalida che un valore è una data valida. Segue un formato AAAA-MM-GG valido. La sua sintassi è la seguente:

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

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

Scelta

Questo vincolo viene utilizzato per garantire che il valore dato sia uno di un dato insieme di scelte valide. Può anche essere utilizzato per convalidare che ogni elemento in un array di elementi è una di quelle scelte valide. La sua sintassi è la seguente:

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

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

Password utente

Ciò convalida che un valore di input sia uguale alla password dell'utente autenticato corrente. Ciò è utile in un modulo in cui gli utenti possono modificare la propria password, ma devono inserire la vecchia password per sicurezza. La sua sintassi è la seguente:

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

Questo vincolo convalida che la vecchia password corrisponda alla password corrente dell'utente.

Esempio di convalida

Scriviamo un semplice esempio di applicazione per comprendere il concetto di convalida.

Step 1 - Crea un'applicazione di convalida.

Crea un'applicazione Symfony, validationsample, utilizzando il seguente comando.

symfony new validationsample

Step 2 - Crea un'entità denominata, FormValidation in file “FormValidation.php” sotto il “src/AppBundle/Entity/”directory. Aggiungi le seguenti modifiche al file.

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 file validateActionmetodo in StudentController. Spostati nella directory“src/AppBundle/Controller”, creare “studentController.php” file e aggiungi il codice seguente.

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

Qui, abbiamo creato il modulo utilizzando le classi Form e quindi abbiamo gestito il modulo. Se il modulo viene inviato ed è valido, viene visualizzato un messaggio di convalida del modulo. In caso contrario, viene visualizzato il modulo predefinito.

Step 4- Crea una vista per l'azione creata sopra in StudentController. Spostati nella directory“app/Resources/views/student/”. Creare“validate.html.twig” file e aggiungi il seguente codice in esso.

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

Qui abbiamo utilizzato i tag del modulo per creare il modulo.

Step 5 - Infine, esegui l'applicazione, http://localhost:8000/student/validate.

Risultato: pagina iniziale

Risultato: pagina finale