Aller au contenu principal

Notre premier contrôleur

Découvrons la structure de Symfony et créons notre premier contrôleur

MVC

Notions théoriques

Symfony et le pattern MVC

Symfony est un framework PHP qui s'appuie sur le Modèle-Vue-Contrôleur (MVC), un paradigme architectural conçu pour séparer clairement la logique métier, la présentation et le traitement des requêtes.

Correspondance avec les composants MVC

Composant MVCRôle dans SymfonyÉléments typiques
ModèleGère les données, les règles métier et l'accès à la baseEntités Doctrine, Repositories, Services/Handlers
VuePrésente les données à l'utilisateurTemplates Twig (.html.twig), composants UI
ContrôleurReçoit la requête, orchestre le modèle et prépare la réponseClasses étendant AbstractController, méthodes d'action

Cycle de vie d'une requête dans Symfony

  1. Le Routeur matche l'URL et délègue l'exécution à un Contrôleur.
  2. Le Contrôleur sollicite le Modèle (services, repositories) pour lire ou modifier des données.
  3. Il passe ces données à une Vue (Twig) qui génère le rendu final.
  4. Le Contrôleur retourne un objet Symfony\Component\HttpFoundation\Response.

Précision architecturale

Symfony respecte les principes du MVC, mais l'adapte à une approche moderne centrée sur le cycle Requête → Contrôleur → Service/Entité → Vue → Réponse. Contrairement à certains frameworks plus rigides, Symfony ne force pas une classe Model unique : la logique métier est déléguée à des services et des entités, ce qui favorise la testabilité, la réutilisabilité et une maintenance plus simple.

remarque

Symfony n'est pas seulement "compatible MVC", il en fait son fondement structurel, tout en l'alignant sur les standards actuels du développement web PHP.

Structure de dossier dans Symfony

Symfony suit une structure de dossier bien définie qui facilite la gestion et l'organisation du code.

Les principaux dossiers que vous utiliserez sont :

  • src : Contient le code source de votre application. C'est ici que vous créez vos contrôleurs, entités, formulaires, etc.
  • templates : Contient les fichiers de vues de votre application. Symfony utilise le moteur de template Twig.
  • public : C'est le répertoire racine de votre application Web. Il contient le fichier index.php qui est le point d'entrée de toutes les requêtes.

Un contrôleur dans Symfony est une classe PHP qui contient des méthodes d'action public. Ces méthodes d'action sont appelées lorsque certaines routes (URL) sont demandées par le client. Dans un modèle MVC, le contrôleur agit comme un intermédiaire entre le modèle (qui gère les données) et la vue (qui présente les données à l'utilisateur).

Pour créer un contrôleur dans Symfony, vous pouvez créer une nouvelle classe dans le répertoire src/Controller. Cette classe doit étendre la classe AbstractController de Symfony et doit contenir au moins une méthode d'action public. Par exemple :

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

class GameController extends AbstractController
{
public function index(): Response
{
return new Response('Hello, world!');
}
}

Pour créer un contrôleur, vous pouvez aussi utiliser la commande make:controller de Symfony.

Exemple de mise en application

Maintenant, créons notre premier contrôleur. Dans votre terminal, exécutez la commande suivante :

php bin/console make:controller GameController

Cela créera un nouveau fichier GameController.php dans le dossier src/Controller. Ouvrez ce fichier, vous verrez une méthode index(). Cette méthode est une action qui renvoie une réponse HTTP. Par défaut, elle renvoie une vue Twig. Vous pouvez la modifier pour renvoyer un texte simple, comme ceci :

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

class GameController extends AbstractController
{
public function index(): Response
{
return new Response('Welcome to our game!');
}
}

Maintenant, si vous accédez à http://localhost:8000/game, vous verrez le texte "Welcome to our game".

Test de mémorisation/compréhension


Qu'est-ce qu'un contrôleur dans Symfony ?


Quel dossier contient le code source de l'application ?


Quelle est la fonction d'une action dans un contrôleur ?


Quel dossier contient les fichiers de vues de l'application ?


Comment crée-t-on un contrôleur dans Symfony ?


Qu'est-ce qu'une méthode d'action dans Symfony ?


Quelle classe un contrôleur Symfony doit-il étendre ?


Comment renvoie-t-on une réponse HTTP dans Symfony ?



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

Votre défi pour aujourd'hui consiste à créer votre premier contrôleur dans Symfony qui renvoie un message simple. Suivez les étapes ci-dessous pour accomplir cette tâche.

1. Créez un contrôleur PlayerController

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

php bin/console make:controller PlayerController

2. Implémentez une action index qui renvoie "Salut les SIO !".

  1. ouvrez le fichier /src/Controller/PlayerController.php
  2. effacez le code généré par défaut dans la méthode index()
  3. et modifiez cette méthode index() pour renvoyer le texte "Salut les SIO !".
  1. vérifier la présence de l'attribut de route #[Route('/player', name: 'player_index')] au-dessus de la méthode index() pour définir l'URL d'accès à cette action.

  2. Enregistrez les modifications apportées au fichier PlayerController.php.

Bonne pratique - Nommer ses routes

Il est conseillé de toujours nommer les routes avec l'attribut name dans #[Route(...)]. Les noms de routes permettent de générer des URLs dans les vues Twig avec {{ path('player_index') }} et dans les contrôleurs avec $this->redirectToRoute('player_index'). Cela évite de dupliquer les URLs en dur dans le code et facilite les refactorisations.

3. Testez votre contrôleur

En accédant à http://localhost:8000/player dans votre navigateur. Vous devriez voir "Salut les SIO !".

4. Personnalisez votre message de bienvenue

Modifiez votre action index() pour accepter un paramètre de requête firstname et personnaliser le message de bienvenue.

Par exemple, si vous accédez à http://localhost:8000/player?firstname=Alice, le message devrait être "Salut Alice !".

  1. ajoutez la récupération du paramètre firstname à partir de la requête dans votre méthode index(), en utilisant $request->query->get('firstname') pour obtenir la valeur du paramètre firstname que vous stockerez dans la variable $name.
  2. modifiez la réponse pour inclure le nom personnalisé dans le message de bienvenue.

5. Testez votre contrôleur

Enregistrez les modifications et testez à nouveau votre contrôleur en accédant à http://localhost:8000/player?firstname=Léo pour voir le message personnalisé "Salut Léo !".

6. Créer une nouvelle action wellcome

Toujours dans le même contrôleur PlayerController, créez une nouvelle action wellcome avec la route #[Route('/player/wellcome', name: 'player_wellcome')]

  1. ajoutez une nouvelle méthode wellcome() dans la classe PlayerController qui renvoie une réponse de bienvenue simple : "Bienvenue !".
  1. testez cette nouvelle action en accédant à http://localhost:8000/player/wellcome pour voir le message "Bienvenue !".

7. Personnaliser le message de bienvenue avec un paramètre de route

  1. ajoutez l'attribut {team} à la route #[Route('/player/wellcome', name: 'player_wellcome')] pour indiquer que le paramètre team est une partie de la route.

Cela permettra de personnaliser le message de bienvenue en fonction du nom fourni dans l'URL.

  1. ajoutez le paramètre team à la méthode wellcome() en modifiant sa signature pour accepter un argument string $team.

Cela permettra de récupérer directement le paramètre de route team dans la méthode d'action grâce à l'injection de dépendance, ce qui simplifie le code et rend la personnalisation du message de bienvenue plus intuitive.

  1. dans la méthode wellcome(), récupérez le paramètre team directement à partir de la signature de la méthode en utilisant l'injection de dépendance (en ajoutant string $team comme argument de la méthode).

8. Testez votre contrôleur

Maintenant, si vous accédez à http://localhost:8000/player/wellcome/Léo, vous devriez voir le message "Bienvenue Léo !".

Résumé du TP

  1. Nous avons créé un contrôleur PlayerController avec une action index() qui renvoie un message de bienvenue simple.
  2. Nous avons personnalisé ce message en utilisant un paramètre de requête team pour afficher un message personnalisé.
  3. Nous avons créé une nouvelle action wellcome() qui accepte un paramètre de route team pour personnaliser le message de bienvenue en fonction du nom fourni dans l'URL.