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


Publié

dans

,

par

Étiquettes :

Commentaires

3 réponses à “Valider les champs d’un formulaire avec Silex et « Validator Constraints »”

  1. Avatar de Guy Couet-Lannes

    Merci pour toutes ces infos. Bonnes fêtes de fin d’année.

  2. Avatar de Grand Maître L

    Bonjour,
    Pour ma part j’utilise ceci dans un projet.
    ->add(‘category’, ChoiceType::class, [
    ‘label’ => ‘Catégorie’,
    ‘choices’ => $allCategories,
    ‘multiple’ => false,
    ‘expanded’ => false,
    ])
    $allCategories viens d’une requête que je fais dans le formType :
    $allCategories = [];
    foreach ($options[‘data’]->allCategories as $category) {
    $allCategories[ $category->getCategoryDisplayName()] = $category->getCategory_article_id();
    }

    EntityType est plus adapté mais il implique qu’injecter via un injecteur de dépendance doctrine… …Ce que cours n’explique pas car il se veux simple.

    Attention, Silex est en fin de vie chez sensiolab la version 4 de symfony devrait le remplacer.

  3. Avatar de Guy Couet-Lannes

    Bonsoir Luc,
    Je suis parti du tuto OC ‘Evoluez vers une architecture PHP professionnelle’. Pour faire simple, j’ai une classe Product et une classe Category. Dans mon formulaire de saisie ProductType, je voudrais intégrer une liste déroulante des différentes catégories enregistrées dans ma table category de manière à associer une catégorie de produits à un produit.
    Le composant ChoiceType ne paraît pas approprié. Le peu de littérature que j’ai trouvé sur le net parle de l’utilisation préférable de l’EntityType mais ce composant Symfony est-il intégré de base à Silex ? Comment faire? Un petit billet pour compléter l’itération 9 serait le bienvenu.
    Cordialement Guy

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.