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

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 MVC | Rôle dans Symfony | Éléments typiques |
|---|---|---|
| Modèle | Gère les données, les règles métier et l'accès à la base | Entités Doctrine, Repositories, Services/Handlers |
| Vue | Présente les données à l'utilisateur | Templates Twig (.html.twig), composants UI |
| Contrôleur | Reçoit la requête, orchestre le modèle et prépare la réponse | Classes étendant AbstractController, méthodes d'action |
Cycle de vie d'une requête dans Symfony
- Le Routeur matche l'URL et délègue l'exécution à un Contrôleur.
- Le Contrôleur sollicite le Modèle (services, repositories) pour lire ou modifier des données.
- Il passe ces données à une Vue (Twig) qui génère le rendu final.
- 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.
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 fichierindex.phpqui 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
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 !".
- ouvrez le fichier
/src/Controller/PlayerController.php - effacez le code généré par défaut dans la méthode
index() - et modifiez cette méthode
index()pour renvoyer le texte "Salut les SIO !".
-
vérifier la présence de l'attribut de route
#[Route('/player', name: 'player_index')]au-dessus de la méthodeindex()pour définir l'URL d'accès à cette action. -
Enregistrez les modifications apportées au fichier
PlayerController.php.
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/playerdans 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 !".
- ajoutez la récupération du paramètre
firstnameà partir de la requête dans votre méthodeindex(), en utilisant$request->query->get('firstname')pour obtenir la valeur du paramètrefirstnameque vous stockerez dans la variable$name. - 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')]
- ajoutez une nouvelle méthode
wellcome()dans la classePlayerControllerqui renvoie une réponse de bienvenue simple : "Bienvenue !".
- testez cette nouvelle action en accédant à
http://localhost:8000/player/wellcomepour voir le message "Bienvenue !".
7. Personnaliser le message de bienvenue avec un paramètre de route
- ajoutez l'attribut
{team}à la route#[Route('/player/wellcome', name: 'player_wellcome')]pour indiquer que le paramètreteamest une partie de la route.
Cela permettra de personnaliser le message de bienvenue en fonction du nom fourni dans l'URL.
- ajoutez le paramètre
teamà la méthodewellcome()en modifiant sa signature pour accepter un argumentstring $team.
Cela permettra de récupérer directement le paramètre de route
teamdans 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.
- dans la méthode
wellcome(), récupérez le paramètreteamdirectement à partir de la signature de la méthode en utilisant l'injection de dépendance (en ajoutantstring $teamcomme 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
- Nous avons créé un contrôleur
PlayerControlleravec une actionindex()qui renvoie un message de bienvenue simple. - Nous avons personnalisé ce message en utilisant un paramètre de requête
teampour afficher un message personnalisé. - Nous avons créé une nouvelle action
wellcome()qui accepte un paramètre de routeteampour personnaliser le message de bienvenue en fonction du nom fourni dans l'URL.