Maison > développement back-end > tutoriel php > Formulaires de construction et de traitement dans Symfony 2

Formulaires de construction et de traitement dans Symfony 2

Jennifer Aniston
Libérer: 2025-02-21 09:33:12
original
221 Les gens l'ont consulté

Building and Processing Forms in Symfony 2

Ce tutoriel explore deux approches pour la gestion de la forme dans Symfony 2. Le premier démontre des éléments de formulaire d'intégration directement dans la vue et les traitant manuellement dans le contrôleur. Le second utilise le système de formulaire de Symfony pour la déclaration de formulaire orientée objet et le traitement et la persistance automatisés.

Nous utiliserons ACMeMobundle par défaut de Symfony pour l'illustration. Le code complet est disponible dans [ce référentiel] (Repository_link_here - Remplacez par un lien réel si disponible).

Concepts clés:

  • Symfony 2 propose deux méthodes principales pour la création et la manipulation de formulaires: l'incorporation manuelle HTML dans la vue avec le traitement basé sur le contrôleur, et le système de formulaire orienté objet de Symfony.
  • Les formulaires de non-entité sont créés en ajoutant des éléments de formulaire HTML standard à un fichier de vue Symfony. Cela implique un fichier d'affichage contenant le formulaire HTML, une méthode de contrôleur pour la manipulation de la logique (rendu, traitement) et une route mappant une URL vers la méthode du contrôleur.
  • Les entités et les formulaires Symfony offrent une approche plus efficace. Cela implique la création d'un formulaire pour une entité Symfony, en utilisant le générateur de formulaire Symfony et en définissant des méthodes pour la construction de formulaires, la dénomination et les options par défaut. Ces formulaires sont construits et affichés via des méthodes de contrôleur.
  • Le système de formulaire de Symfony est flexible, s'adaptant à divers besoins. Pour les opérations CRUD liées à la base de données, le système de formulaire Symfony est préféré. Pour des formes simples et non persistantes, l'intégration directe de HTML dans la vue est suffisante.

Formes de non-entité:

Cet exemple démontre les formulaires de traitement défini comme HTML standard dans un fichier de vue Symfony. Le processus implique trois étapes:

  1. Affichage de la création de fichiers: A form1.html.twig Le fichier (situé dans src/Acme/DemoBundle/Resources/views/Welcome) contient le HTML:
  2. du formulaire
{% extends "AcmeDemoBundle::layout.html.twig" %}

{% block content %}

<h1>Form values</h1>

{% if name is defined %}
<p>Name: {{ name }} </p>
{% endif %}

<form method="post" action="{{ path('_form1') }}">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name" /><br>
    <input type="submit" name="submit" value="Submit" />
</form>

{% endblock %}
Copier après la connexion
Copier après la connexion
  1. Méthode du contrôleur: Le WelcomeController comprend une méthode A form1Action:
use Symfony\Component\HttpFoundation\Request;

// ... other code ...

public function form1Action(Request $request)
{
    $name = 'Not submitted yet';
    if ($request->isMethod('POST') && $request->request->has('submit')) {
        $name = $request->request->get('name');
    }

    return $this->render('AcmeDemoBundle:Welcome:form1.html.twig', ['name' => $name]);
}
Copier après la connexion
Copier après la connexion
  1. Définition de l'itinéraire: Le fichier routing.yml (dans src/Acme/DemoBundle/Resources/config) comprend:
_form1:
    path: /form1
    defaults: { _controller: AcmeDemoBundle:Welcome:form1 }
Copier après la connexion
Copier après la connexion

Cela mappe /form1 à la méthode form1Action.

Cette approche, bien que fonctionnelle, est moins adaptée aux formes complexes ou à la persistance des données.

Entités et formulaires Symfony:

Cette section illustre la création et le traitement d'un formulaire pour une entité Symfony (par exemple, Article). Nous utiliserons cinq fichiers: le contrôleur, routing.yml, deux fichiers de vue (form2.html.twig, form2saved.html.twig) et une classe de type de formulaire ArticleType.php.

  1. ARTICLETYPE.PHP: (Situé dans src/Acme/DemoBundle/Form)
{% extends "AcmeDemoBundle::layout.html.twig" %}

{% block content %}

<h1>Form values</h1>

{% if name is defined %}
<p>Name: {{ name }} </p>
{% endif %}

<form method="post" action="{{ path('_form1') }}">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name" /><br>
    <input type="submit" name="submit" value="Submit" />
</form>

{% endblock %}
Copier après la connexion
Copier après la connexion
  1. WelcomeController:
use Symfony\Component\HttpFoundation\Request;

// ... other code ...

public function form1Action(Request $request)
{
    $name = 'Not submitted yet';
    if ($request->isMethod('POST') && $request->request->has('submit')) {
        $name = $request->request->get('name');
    }

    return $this->render('AcmeDemoBundle:Welcome:form1.html.twig', ['name' => $name]);
}
Copier après la connexion
Copier après la connexion
  1. form2.html.twig:
_form1:
    path: /form1
    defaults: { _controller: AcmeDemoBundle:Welcome:form1 }
Copier après la connexion
Copier après la connexion
  1. form2saved.html.twig:
<?php

namespace Acme\DemoBundle\Form;

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

class ArticleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', 'text', ['label' => 'Title'])
            ->add('body', 'textarea')
            ->add('save', 'submit')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(['data_class' => 'Acme\DemoBundle\Entity\Article']);
    }

    public function getName()
    {
        return 'article';
    }
}
Copier après la connexion
  1. routing.yml:
// ... other uses ...
use Acme\DemoBundle\Entity\Article;
use Acme\DemoBundle\Form\ArticleType;

// ... other methods ...

public function form2Action(Request $request)
{
    $article = new Article();
    $form = $this->createForm(ArticleType::class, $article);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($article);
        $em->flush();
        $this->addFlash('message', 'Article saved!');
        return $this->redirectToRoute('_form2saved');
    }

    return $this->render('AcmeDemoBundle:Welcome:form2.html.twig', ['form' => $form->createView()]);
}

public function form2savedAction()
{
    return $this->render('AcmeDemoBundle:Welcome:form2saved.html.twig');
}
Copier après la connexion

Cette approche exploite les fonctionnalités de Symfony pour une solution plus robuste et maintenable. Choisissez la méthode la mieux adaptée à la complexité de votre formulaire et aux besoins de gestion des données. Pour les formes complexes ou les interactions de base de données, l'approche entité / formulaire est fortement recommandée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal