Symfony : – Les formulaires “MVC”

00:53:51

Les formulaires jouent un rôle crucial dans les applications web, servant d’interface principale pour l’interaction entre l’utilisateur et l’application. En Symfony, le composant Form s’inscrit parfaitement dans l’architecture MVC (Modèle-Vue-Contrôleur), orchestrant les interactions entre ces trois couches pour traiter les données des utilisateurs de manière élégante et robuste.

Le Modèle

Dans le contexte MVC, la couche Modèle représente les données de l’application. En Symfony, ces données sont généralement manipulées sous forme d’entités Doctrine ou de classes PHP classiques.

Exemple : Modèle de Client

Voici un exemple de classe PHP représentant un client :

namespace App\Model;

class Client
{
    private ?string $nom = null;
    private ?\DateTime $dateDeNaissance = null;

    public function setNom(string $nom): self
    {
        $this->nom = $nom;
        return $this;
    }

    public function getNom(): ?string
    {
        return $this->nom;
    }

    public function setDateDeNaissance(\DateTime $dateDeNaissance): self
    {
        $this->dateDeNaissance = $dateDeNaissance;
        return $this;
    }

    public function getDateDeNaissance(): ?\DateTime
    {
        return $this->dateDeNaissance;
    }
}
Cette classe représente un client avec des propriétés nom et date de naissance, accompagnées de leurs accesseurs et mutateurs. Si vous utilisez Doctrine, cette classe peut être enrichie de mappages d'entités. Objectif Le composant Form permet de : Créer ou modifier des instances de cette classe, Synchroniser automatiquement les données transmises par l’utilisateur via un formulaire avec les propriétés de la classe. Le Contrôleur Le contrôleur agit comme le point central de coordination. Il orchestre les interactions entre le formulaire, le modèle et la vue. Rôles du Contrôleur Créer ou récupérer un objet du Modèle. Créer un formulaire associé à cet objet pour permettre sa modification. Transmettre le formulaire à la vue pour affichage. Gérer la validation et le traitement des données soumises. Exemple : Contrôleur de Formulaire Voici un exemple d'action de contrôleur utilisant un formulaire pour gérer un objet Client : use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use App\Model\Client; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\BirthdayType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; class DefaultController extends AbstractController { #[Route("/")] public function index(Request $request): Response { // Création d'un objet Client $client = new Client(); // Création du formulaire $form = $this->createFormBuilder($client) ->add('nom', TextType::class) ->add('dateDeNaissance', BirthdayType::class) ->add('valider', SubmitType::class) ->getForm(); // Gestion des données soumises $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { return new Response('Le formulaire est valide.'); } // Rendu du formulaire dans une vue return $this->render('default/index.html.twig', [ 'form' => $form->createView(), ]); } } La Vue La couche Vue est responsable de l’affichage. Symfony facilite grandement cette tâche avec l'intégration du composant Form et des fonctions Twig associées. Transmission des Données à la Vue Dans le contrôleur, le formulaire est envoyé à la vue sous la forme d’un objet transformé via la méthode createView() : $form->createView(); Exemple de Template Twig L’affichage d’un formulaire est simplifié grâce à la fonction Twig form() : <!DOCTYPE html> <html> <head> <title>Formulaire Client</title> </head> <body> {{ form(form) }} </body> </html> Cette méthode génère automatiquement le HTML pour tout le formulaire, y compris les balises <form> , <input> , et les attributs nécessaires. Personnalisation de l’Affichage Le composant Form permet de personnaliser chaque champ ou le formulaire dans son ensemble. Nous explorerons ces options dans les sections dédiées. Fonctionnement MVC du Composant Form Modèle : Les Données L'objet Client sert de modèle. Les données soumises par l’utilisateur sont mappées automatiquement aux propriétés correspondantes grâce à la structure des formulaires. Vue : Affichage et Validation La fonction Twig form() simplifie le rendu. Les erreurs de validation, comme "Champ obligatoire" ou "Format invalide", sont automatiquement gérées et affichées dans la vue. Contrôleur : Orchestration Le contrôleur connecte les données (modèle) au formulaire (vue). Il traite les soumissions et valide les données, puis décide des actions à prendre. Avantages Centralisation et Abstraction : Le composant Form gère la synchronisation entre l’objet et les données utilisateur, simplifiant la logique du contrôleur. Validation Automatique : En intégrant les contraintes de validation Symfony, les formulaires assurent la cohérence des données transmises. Personnalisation Flexible : Chaque champ peut être personnalisé individuellement. Le rendu global ou spécifique peut être adapté selon les besoins. Extensibilité : Le composant peut interagir avec des entités Doctrine ou des classes PHP simples. Compatible avec divers champs de formulaire, y compris des champs complexes comme les dates, les fichiers ou les collections. Documentation Symfony Forms : https://symfony.com/doc/current/forms.html Twig pour les Formulaires : https://twig.symfony.com/doc/3.x/functions/form.html Validation des Données : https://symfony.com/doc/current/validation.html Le composant Form de Symfony est un puissant outil s’intégrant parfaitement dans l’architecture MVC. Il simplifie le processus de création, de validation et de gestion des données utilisateur tout en offrant une grande flexibilité et une robustesse inégalée. Apprendre à maîtriser ce composant est une étape essentielle pour développer des applications Symfony efficaces et bien structurées.
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\/4980\/et-divi-dynamic-tb-8749-tb-7217-tb-6415-4980-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":"a13b553688","subscription_failed":"Veuillez v\u00e9rifier les champs ci-dessous pour vous assurer que vous avez entr\u00e9 les informations correctes.","et_ab_log_nonce":"4d42f5155b","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":"4980","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":"a26b50e8b4","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; }