Aller au contenu principal

Routage et vues

Comment Symfony gère les routes, avec le routage (Routing), et les vues

Routing Declaration


Routing Request Flow


Notions théoriques

Le système de routage de Symfony est ce qui mappe les URL aux contrôleurs. Chaque route est définie par un chemin (l'URL) et une action (la méthode du contrôleur à appeler).

Il y a 3 façons de définir les routes :

  1. Les routes peuvent être définies **dans le fichier config/routes.yaml **

    Exemple :

    player_index:
    path: /player
    # the controller value has the format 'controller_class::method_name'
    controller: App\Controller\GameController::index
  2. Les routes peuvent être définies directement dans le contrôleur en utilisant les annotations de PHP >= 5.3.

    Exemple :

    /**
    * @Route("/player", name="player_index")
    */
  3. Les routes peuvent être définies directement dans le contrôleur en utilisant les attributs PHP >= 8.

    Exemple :

    #[Route('/player', name: 'player_index')]

Par exemple, pour définir une route pour notre méthode d'action index dans GameController, nous pouvons ajouter l'attribut #[Route('/game', name: 'game')] juste avant la déclaration de la méthode. Cela signifie que lorsque nous accédons à l'URL '/game', Symfony appellera la méthode index de GameController.

Les vues dans Symfony sont généralement construites avec le moteur de template Twig. Pour afficher une vue, nous pouvons utiliser la méthode render de AbstractController, qui prend le chemin du template Twig et un tableau de variables à passer au template.

Exemple de mise en application

Supposons que nous voulons créer une route pour afficher les détails d'un joueur. Dans le contrôleur PlayerController, ajoutez la méthode suivante :

/**
* @Route("/player/{id}", name="player_show")
*/
public function show(int $id): Response
{
return new Response('Affichage du joueur : ' . $id);
}

Maintenant, si vous accédez à http://localhost:8000/player/1, vous verrez le message "Affichage du joueur : 1".

Pour rendre une vue, créez un fichier show.html.twig dans le dossier templates/player et ajoutez le code suivant :

<h1>Affichage du joueur : {{ id }}</h1>

Ensuite, modifiez la méthode show() pour rendre cette vue :

public function show(int $id): Response
{
return $this->render('player/show.html.twig', ['id' => $id]);
}

Test de mémorisation/compréhension


Qu'est-ce que le routage dans Symfony ?


Où sont stockés les fichiers de vue dans Symfony ?


Comment rendre une vue dans un contrôleur ?


Quel moteur de template Symfony utilise-t-il par défaut ?


Comment définissons-nous une route dans Symfony avec PHP 8 ?


Comment passons-nous des variables à une vue Twig ?


Quelle est la syntaxe pour définir une route avec un paramètre dans Symfony ?


Comment accédons-nous à une variable passée à une vue Twig ?


Quelle est la méthode de contrôleur utilisée pour rendre une vue Twig ?



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

Votre défi pour aujourd'hui consiste à créer une route et une vue

1. Créez un contrôleur GameController

Créez un nouveau fichier GameController.php dans le dossier src/Controller avec la commande :

php bin/console make:controller GameController

2. Implémentez une action show dans GameController pour afficher les détails d'un jeu

Dans GameController, créez la méthode show qui accepte id en paramètre et rend la vue game/show.html.twig.

  1. Ajoutez l'attribut de route #[Route('/game/{id}', name: 'game_show')] à la méthode show() pour définir la route qui affichera les détails d'un jeu en fonction de son ID.

3. Créez le fichier templates/game/show.html.twig pour afficher l'ID du jeu.


Bonne pratique - Séparer la logique de l'affichage

Le contrôleur ne doit pas contenir de HTML. Son rôle est de récupérer les données et de les passer à la vue avec render(). Twig s'occupe de l'affichage. Cette séparation rend le code plus facile à maintenir : on peut modifier l'apparence sans toucher à la logique PHP, et vice-versa.

Une solution complète pour le TP