7 - Création des contrôleurs (Symfony 6)

Temps de lecture : 15 minutes environ.

Dans cette 7ème partie nous allons créer les contrôleurs de notre projet e-commerce.

Les contrôleurs dans Symfony jouent un rôle central dans la gestion des requêtes HTTP et la définition des routes de l'application. En effet, chaque contrôleur est responsable de traiter une requête spécifique et de renvoyer une réponse appropriée. Lorsqu'un utilisateur accède à une adresse particulière de votre site, Symfony associe cette adresse, ou "route", à une méthode de contrôleur spécifique. Cette méthode de contrôleur va ensuite exécuter la logique nécessaire pour traiter la requête, qu'il s'agisse de récupérer des données depuis une base de données, de traiter un formulaire soumis, ou simplement de renvoyer une vue préformatée. Les routes sont définies soit directement dans les annotations du contrôleur, soit dans des fichiers de configuration spécifiques, ce qui permet une grande flexibilité dans la gestion des URL de l'application. Ainsi, les contrôleurs et les routes travaillent ensemble pour assurer la navigation fluide et cohérente à travers les différentes sections de votre site web, tout en maintenant une architecture claire et organisée.

Nous avons déjà dans notre projet le MainController dont le code est le suivant

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class MainController extends AbstractController
{
#[Route('/', name: 'main')]
public function index(): Response
{
return $this->render('main/index.html.twig');
}
}

Dans ce contrôleur, nous avons créé la route de la page d'accueil, '/', qui permet donc à notre projet d'être chargé sur une adresse de type https://mondomaine.ext

L'attribut #[Route(…)] est ici pour créer cette route et y apporter des options.

Dans le cas de l'attribut #[Route('/', name: 'main')] on aura :

  • '/' qui correspond à l'adresse de notre page
  • name: 'main' qui correspond au nom de notre route, un nom qui pourra être appelé depuis d'autres parties de notre code pour y faire référence

Dans ce contrôleur simple, la ligne return $this->render('main/index.html.twig'); va appeler une vue twig pour afficher du contenu.

Créer un contrôleur

On va, par exemple, créer un contrôleur pour le profil de l'utilisateur. On pourrait créer les fichiers à la main sans problème, mais le “Maker Bundle” nous permet de créer nos contrôleurs automatiquement au moyen de la commande suivante

symfony console make:controller ProfileController

Cette commande va créer :

  • Un fichier src/Controller/ProfileController.php qui sera notre contrôleur
  • Un fichier templates/profile/index.html.twig qui sera notre vue par défaut

Nous pouvons maintenant aller à une adresse du type https://mondomaine.ext/profile

Le code par défaut du contrôleur est le suivant

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ProfileController extends AbstractController
{
#[Route('/profile', name: 'profile')]
public function index(): Response
{
return $this->render('profile/index.html.twig', [
'controller_name' => 'ProfileController',
]);
}
}

Nous pouvons y apporter quelques modifications, par exemple, ajouter une annotation Route avant la classe pour mettre un préfixe général à toutes les routes de cette classe, comme ceci

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

#[Route('/profil', name: 'profile_')]
class ProfileController extends AbstractController
{
#[Route('/', name: 'index')]
public function index(): Response
{
return $this->render('profile/index.html.twig', [
'controller_name' => 'ProfileController',
]);
}
}

Avec cette modification, la route correspondant à la méthode index dirige vers /profil et se nomme profile_index

Nous pouvons ajouter une autre méthode dans cette classe comme ceci

    #[Route('/commandes', name: 'orders')]
public function orders(): Response
{
return $this->render('profile/index.html.twig', [
'controller_name' => 'Commandes de l\'utilisateur',
]);
}

Cette route correspond à /profil/commandes et se nomme profile_orders

Passer des informations au contrôleur

Nous allons créer un contrôleur permettant d'afficher les produits et les informations d'un produit en particulier.

Le contrôleur par défaut sera le suivant

<?php

namespace App\Controller;

use App\Entity\Products;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

#[Route('/produits', name: 'products_')]
class ProductsController extends AbstractController
{
#[Route('/', name: 'index')]
public function index(): Response
{
return $this->render('products/index.html.twig');
}
}

Nous allons y ajouter une méthode details permettant d'afficher un produit par l'intermédiaire de son slug.

Pour ce faire, nous utiliseront l'injection de dépendance permise par Symfony en ajoutant un paramètre {slug} dans notre route et en ajoutant la propriété Products $product dans notre méthode comme ceci

    #[Route('/{slug}', name: 'details')]
public function details(Products $product): Response
{
return $this->render('products/details.html.twig', compact('product'));
}

L'injection de dépendance permettra d'aller charger automatiquement le produit dont on aura mis le slug dans notre URL.

Nous passons ensuite ce produit dans la vue en l'ajoutant en paramètre de la méthode render par compact('product')

Vous trouverez plus de détails dans la vidéo ci-dessus.

Obtenir de l'aide

Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat.

7 - Création des contrôleurs (Symfony 6)
Article publié le - Modifié le

Catégorie : Symfony

Mots-clés : Routes Symfony controleur symfony6

Partager : Partager sur Facebook Partager sur Twitter Partager sur LinkedIn