Symfony : – La Validation des Données

18:29:19

Le composant de validation de Symfony est conçu pour vérifier la conformité des données. Il peut être utilisé indépendamment ou avec des formulaires. Voici une vue détaillée de son fonctionnement et de ses possibilités.

Objectifs de la Validation

  • Validation côté serveur : Assurez-vous que les données respectent des critères définis.
  • Complément au HTML5 : Les attributs tels que
    required

    offrent une validation côté client, mais seule la validation serveur est fiable.

  • Exemples courants :
    • Vérifier qu’un champ n’est pas vide.
    • Valider une adresse e-mail ou un numéro de téléphone.
    • Vérifier la longueur ou le format des données.

Définir des Contraintes de Validation

Les contraintes définissent les règles que doivent respecter les données. Elles peuvent être configurées de deux manières :

  1. Au niveau de l’objet du modèle : Les règles sont associées directement aux propriétés de l’objet (souvent une entité Doctrine).
  2. Au niveau du formulaire : Les règles sont définies lors de la création du formulaire, via l’option
    constraints

    .

a. Contraintes sur les Champs du Formulaire

Les contraintes sont ajoutées à l’aide de l’option

constraints

pour chaque champ :

use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;

$form = $this->createFormBuilder()
    ->add('email', EmailType::class, [
        'constraints' => [
            new NotBlank(['message' => 'L\'email est obligatoire.']),
            new Email(['message' => 'Veuillez entrer une adresse email valide.']),
        ],
    ])
    ->add('message', TextareaType::class, [
        'constraints' => new NotBlank(),
    ])
    ->getForm();
Avantages : Les règles sont définies directement les champs sont configurés. Plus simple à maintenir pour les formulaires uniques. b. Contraintes sur l'Objet Associé Les contraintes peuvent être directement associées aux propriétés d'un objet (comme une entité Doctrine) : use Symfony\Component\Validator\Constraints as Assert; class Message { #[Assert\NotBlank(message: 'L\'email est obligatoire.')] #[Assert\Email(message: 'Veuillez entrer une adresse email valide.')] private $email; #[Assert\NotBlank()] private $message; // Getters et Setters... } Dans le contrôleur, le formulaire utilise l’objet pour appliquer ses règles : $form = $this->createFormBuilder($message) ->add('email', EmailType::class) ->add('message', TextareaType::class) ->getForm(); Avantages : Les règles sont réutilisables dans plusieurs formulaires ou contextes (API, services, etc.). Séparation claire entre la logique métier et la logique du formulaire. Formats de Configuration des Contraintes Les contraintes peuvent être définies dans différents formats : attributs, annotations, YAML, XML ou PHP. Attributs : use Symfony\Component\Validator\Constraints as Assert; class Message { #[Assert\NotBlank] #[Assert\Email] private $email; } YAML : App\Entity\Message: properties: email: - NotBlank: ~ - Email: ~ XML : <constraint-mapping> <class name="App\Entity\Message"> <property name="email"> <constraint name="NotBlank" /> <constraint name="Email" /> </property> </class> </constraint-mapping> PHP : use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Constraints as Assert; public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('email', new Assert\NotBlank()); $metadata->addPropertyConstraint('email', new Assert\Email()); } Options des Contraintes Chaque contrainte peut avoir des options pour ajuster son comportement. Exemple : Contrainte Length : #[Assert\Length(min: 5, max: 100, minMessage: 'Trop court.', maxMessage: 'Trop long.')] private $message; Exemple : Contrainte Regex : #[Assert\Regex(pattern: '/^0[6|7][0-9]{8}$/', message: 'Numéro invalide.')] private $telephone; Groupes de Validation Les groupes de validation permettent d’appliquer différentes règles selon le contexte (inscription, modification, etc.). Définir des groupes : #[Assert\NotBlank(groups: ['Inscription'])] private $password; Utiliser les groupes dans un formulaire : $form = $this->createFormBuilder($user, [ 'validation_groups' => ['Inscription'], ])->getForm(); Validation Hors Formulaire Le composant Validator peut être utilisé en dehors des formulaires, par exemple dans des services ou des API. Exemple : Validation d’un Objet : use Symfony\Component\Validator\Validator\ValidatorInterface; public function validateData(ValidatorInterface $validator, Message $message) { $errors = $validator->validate($message); if (count($errors) > 0) { foreach ($errors as $error) { echo $error->getMessage(); // Affiche les erreurs } } else { echo "Les données sont valides."; } } NotBlank : La valeur ne doit pas être vide. Length : Contrôle la longueur d’une chaîne. Email : Valide une adresse e-mail. Regex : Vérifie une correspondance avec une expression régulière. UniqueEntity : Assure l’unicité d’une propriété (entité Doctrine). Choice : Restreint les valeurs possibles à une liste. 🔗 Documentation Symfony : Validation 🔗 Contraintes Disponibles 🔗 Formulaires Symfony La validation des données avec Symfony offre une grande flexibilité et s’intègre harmonieusement avec les formulaires, les objets Doctrine, et les services. En choisissant judicieusement entre validation au niveau des formulaires ou des objets, vous pouvez maintenir un code clair, réutilisable et sécurisé.
par admin4460
Nom d'utilisateur Mot de passe Mot de passe oublié? Se connecter © MyCreaNet 2025 – Mentions légales – Plan du site – Gestion des cookies – Accessibilité
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/Divi\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap:before, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper:before { content: "\45"; font-size: 27px; color: #ccffcc; font-family: ETModules; cursor: pointer; width: 28px; height: 27px; border-radius: 3px; padding-top: 1px; background-color: rgb(255, 255, 255, 0.2) !important; } .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-fb-form__group:nth-of-type(4) { display: none; } jQuery(document).ready(function($) { $(document).on('click', '.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper', function(event) { if (event.target !== event.currentTarget) { return; // Exit the function if the click is on a child element } var firstEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(0)?.CodeMirror; if (!firstEditor) { return; } $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] textarea[name="code_to_render"]').click(); // Enable hidden codemirror var secondEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(1)?.CodeMirror; if (!secondEditor) { return; } var content = firstEditor.getValue(); // Add a random nonce as the first line of content to prevent caching var nonce = Math.random().toString(36).substring(2, 15); content = '/* nonce:' + nonce + ' */\n' + content; secondEditor.setValue(content); }); }); (function() { var file = ["https:\/\/mycreanet.fr\/wp-content\/et-cache\/4994\/et-divi-dynamic-tb-8749-tb-7217-tb-6415-4994-late.css"]; var handle = document.getElementById('divi-style-inline-inline-css'); var location = handle.parentNode; if (0===document.querySelectorAll('link[href="' + file + '"]').length) { var link = document.createElement('link'); link.rel = 'stylesheet'; link.id = 'et-dynamic-late-css'; link.href = file; location.insertBefore(link, handle.nextSibling); } })(); var et_link_options_data = [{"class":"et_pb_post_title_0_tb_header","url":"https:\/\/mycreanet.fr\/dashboard\/","target":"_self"},{"class":"et_pb_code_0_tb_header","url":"https:\/\/mycreanet.fr\/work\/","target":"_self"}]; /* <![CDATA[ */ wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); /* ]]> */ /* <![CDATA[ */ ( function( domain, translations ) { var localeData = translations.locale_data[ domain ] || translations.locale_data.messages; localeData[""].domain = domain; wp.i18n.setLocaleData( localeData, domain ); } )( "contact-form-7", {"translation-revision-date":"2025-02-06 12:02:14+0000","generator":"GlotPress\/4.0.1","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"This contact form is placed in the wrong place.":["Ce formulaire de contact est plac\u00e9 dans un mauvais endroit."],"Error:":["Erreur\u00a0:"]}},"comment":{"reference":"includes\/js\/index.js"}} ); /* ]]> */ /* <![CDATA[ */ var wpcf7 = { "api": { "root": "https:\/\/mycreanet.fr\/wp-json\/", "namespace": "contact-form-7\/v1" } }; /* ]]> */ /* <![CDATA[ */ var tocplus = {"smooth_scroll":"1","visibility_show":"Afficher","visibility_hide":"Masquer","width":"Auto"}; /* ]]> */ /* <![CDATA[ */ var DIVI = {"item_count":"%d Item","items_count":"%d Items"}; var et_builder_utils_params = {"condition":{"diviTheme":true,"extraTheme":false},"scrollLocations":["app","top"],"builderScrollLocations":{"desktop":"app","tablet":"app","phone":"app"},"onloadScrollLocation":"app","builderType":"fe"}; var et_frontend_scripts = {"builderCssContainerPrefix":"#et-boc","builderCssLayoutPrefix":"#et-boc .et-l"}; var et_pb_custom = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/images","builder_images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/images","et_frontend_nonce":"b120b4b5b6","subscription_failed":"Veuillez v\u00e9rifier les champs ci-dessous pour vous assurer que vous avez entr\u00e9 les informations correctes.","et_ab_log_nonce":"9f559fcd79","fill_message":"S'il vous pla\u00eet, remplissez les champs suivants:","contact_error_message":"Veuillez corriger les erreurs suivantes :","invalid":"E-mail non valide","captcha":"Captcha","prev":"Pr\u00e9c\u00e9dent","previous":"Pr\u00e9c\u00e9dente","next":"Prochaine","wrong_captcha":"Vous avez entr\u00e9 le mauvais num\u00e9ro dans le captcha.","wrong_checkbox":"Case \u00e0 cocher","ignore_waypoints":"no","is_divi_theme_used":"1","widget_search_selector":".widget_search","ab_tests":[],"is_ab_testing_active":"","page_id":"4994","unique_test_id":"","ab_bounce_rate":"5","is_cache_plugin_active":"no","is_shortcode_tracking":"","tinymce_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/frontend-builder\/assets\/vendors","accent_color":"#006666","waypoints_options":[]}; var et_pb_box_shadow_elements = []; /* ]]> */ /* <![CDATA[ */ var DiviBlogExtrasFrontendData = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","ajax_nonce":"e7164079b0","et_theme_accent_color":"#006666"}; /* ]]> */ /* <![CDATA[ */ var wpcf7_recaptcha = { "sitekey": "6LdTHXQrAAAAACmbbt7TJPkqCEfzcO8TdF_cEKX-", "actions": { "homepage": "homepage", "contactform": "contactform" } }; /* ]]> */ .wptpa_song_infrmtn, .wptpa_currenttime, .wptpa_duration, .wptpa_song, .wptpa_dwn_cnt, .wptpa_play_cnt, .wptpa_num, .wptpa_h2, .wptpa_ads{ font-family: 'Roboto', sans-serif; } .wptpa_player { background: #FFFFFF !important; } .wptpa_heading:before, .wptpa_heading:after { background: #000000 !important; } .wptpa_song_infrmtn { color: #000000 !important; } .wptpa_btn .wptpa_icon { fill: #555555; } .wptpa_btn.actv .wptpa_icon, .wptpa_btn:hover .wptpa_icon{ fill: #00D084; } .wptpa_btn:before{ background: #555555 !important; } .wptpa_player .wptpa_seek, .wptpa_player .wptpa_loader { background: #FFDA48 !important; } .wptpa_player .wptpa_seek span, .wptpa_progress { background: #CF2E2E !important; } .wptpa_ads, .wptpa_currenttime, .wptpa_duration { color: #FFFFFF !important; } .wptpa_volume_seek:before { background: #FFDA48 !important; } .wptpa_volume_value { background: #CF2E2E !important; } .wptpa_pllst_itm { border-bottom: 1px solid rgba(255, 255, 255, 0.25) !important; background: #23C5A3 !important; color: #000000 !important; } .wptpa_pllst_itm.crrnt, .wptpa_pllst_itm:hover { background: #FFDA48 !important; color: #000000 !important; } .wptpa_pllst_itm:last-child { border-bottom: 0px solid rgba(255, 255, 255, 0.25) !important; } .wptpa_bars, .wptpa_bars:before, .wptpa_bars:after{ background: #000000 !important; } .wptpa_line { border-color: #000000 !important; } .wptpa_pllst_itm .wptpa_icon { fill: #000000; } .wptpa_dwn_cnt, .wptpa_play_cnt { color: #000000 !important; } .wptpa_scroll_bar { background: #000000 !important; }