Valider les champs d’un formulaire avec Silex et « Validator Constraints »

Je me suis associé à Baptiste Pesquet l’auteur du cours sur Openclassrooms « Évoluez vers une architecture PHP professionnelle ». La validation des champs est désormais compatible avec la version 2.1 de silex c’est l’itération 14.

Bonjour,

Aujourd’hui nous allons voir comment ajouter la validation des valeurs de retour d’un formulaire dans le framework Silex.

Après avoir suivi le cours sur Openclassrooms « Évoluez vers une architecture PHP professionnelle », il vous manquera cette partie avant de mettre votre site en ligne.

Pourquoi valider les champs ?

Pour s’assurer que les utilisateurs du site ne cherche pas à enter n’importe quelle donnée n’importe où. Par exemple un numéro de téléphone dans le champ email, tenter de faire passer des valeurs inapproprié et exploiter une faille xss…

Voici comment nous allons procéder :

Dans un premier temps nous allons ajouter un namespace qui sera utilisé par votre buildForm:: ce namespace c’est :

use Symfony\Component\Validator\Constraints as Assert;

Voici ce que j’ai fait pour l’enregistrement d’un email :

<?php

namespace MicroCMS\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class NewsletterType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('email', 'email', [
            'label'      => '',
            'required'   => true,
        ]);
    }

    public function getName() {
        return 'newsletter';
    }

}

On vois que j’ai mis plusieurs contraintes. En premier lieu j’ai décidé que le champ est de type « email »et qu’il est « requis » (required), c’est à dire que sur le html généré, on verra ceci :

<input id="newsletter_email" name="newsletter[email]" required="required" placeholder="Votre email pour vous inscrire à la Newsletter" type="email">

Si l’utilisateur a un navigateur récent, et qu’il soumet le formulaire directement, un message lui dira que ce n’est pas possible car le champ est vide. Si il remplit ce champ avec autre chose qu’un email le navigateur va là aussi l’informer que cette donnée n’est pas valide. C’est une première étape car si l’utilisateur est un petit malin, il peut modifier le type de champ dans le input, supprimer le required et le email. à ce moment là, il pourra soumettre le formulaire sans message d’erreur.

Il faut donc procéder à une deuxième vérification sur les données au niveau du framework et pas seulement dans le navigateur.

Pour cela on va rajouter cette ligne dans notre méthode buildForm, ‘constraints’ => new Assert\Email(),

<?php 
namespace MicroCMS\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints as Assert;

class NewsletterType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('email', 'email', [
            'label'      => '',
            'required'   => true,
            'constraints' => new Assert\Email(),
        ]);
    }

    public function getName() {
        return 'newsletter';
    }

}

Là, on est certain que la valeur attendu sera un email et pas autre chose. Si l’utilisateur fait le malin au niveau de son navigateur, voici ce qui va s’afficher :

  • This value is not a valid email address.

Grand maître L

Laisser un commentaire