Série : Symfony 6
Fichiers : https://github.com/NouvelleTechno/e-commerce-Symfony-6
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 pagename: '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.
Catégorie : Symfony
Mots-clés : Routes Symfony controleur symfony6