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
duFormFactoryInterface
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
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
Vous devez être connecté pour voir le contenu.