Aller au contenu principal

Formulaires avec Symfony

Comment créer et gérer des formulaires avec Symfony

Notions théoriques

Symfony fournit des fonctionnalités puissantes pour créer et gérer des formulaires.

Pour créer un formulaire avec Symfony :

  • Créez une classe qui étend Symfony\Component\Form\AbstractType
  • Définissez les champs du formulaire dans la méthode buildForm

Pour utiliser un formulaire dans un contrôleur :

  • Injectez le FormFactoryInterface dans votre contrôleur
  • Utilisez la méthode create du FormFactoryInterface pour instancier votre formulaire

La gestion de la soumission du formulaire se fait en vérifiant si le formulaire a été soumis et est valide, puis en effectuant les actions nécessaires, comme enregistrer des données dans la base de données.

Exemple de mise en application

Créons un formulaire pour ajouter de nouveaux joueurs.

D'abord, créez une nouvelle classe Form/PlayerType.php :

namespace App\Form;

use App\Entity\Player;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class PlayerType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('name', TextType::class);
}

public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Player::class,
]);
}
}

Ensuite, modifions notre GameController pour utiliser ce formulaire dans une nouvelle action create :

use App\Entity\Player;
use App\Form\PlayerType;
use App\Repository\PlayerRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\FormFactoryInterface;

class GameController extends AbstractController
{
public function __construct(
private PlayerRepository $playerRepository,
private FormFactoryInterface $formFactory
) {}

#[Route('/game/create', name: 'create_player')]
public function create(Request $request): Response
{
$player = new Player();
$form = $this->formFactory->create(PlayerType::class, $player);

$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->playerRepository->save($player, true);

return $this->redirectToRoute('game');
}

return $this->render('game/create.html.twig', ['form' => $form->createView()]);
}
}

Enfin, créons une vue pour afficher le formulaire.

Créez un nouveau fichier templates/game/create.html.twig :

<h1>Create a new player</h1>

{{ form_start(form) }}
{{ form_widget(form) }}
<button type="submit">Create</button>
{{ form_end(form) }}

Maintenant, lorsque vous accédez à 'http://localhost:8000/game/create', vous pouvez voir le formulaire pour créer un nouveau joueur.

Test de mémorisation/compréhension


Quelle interface doit-on injecter pour créer un formulaire dans un contrôleur Symfony ?


Quelle méthode du FormFactoryInterface utilise-t-on pour créer un formulaire ?


Comment gère-t-on la soumission d'un formulaire dans Symfony ?


Quelle méthode utilise-t-on pour persister une entité avec le Repository dans Symfony ?


Comment affiche-t-on un formulaire dans une vue Twig dans Symfony ?



TP pour réfléchir et résoudre des problèmes

Votre défi pour aujourd'hui consiste à créer un formulaire pour mettre à jour un joueur en utilisant l'injection de dépendance

Vous devrez créer une nouvelle action qui récupère un joueur de la base de données, crée et gère un formulaire, puis sauvegarde les modifications dans la base de données.

Une solution