7 - Création des contrôleurs (Symfony 6)
Par Nouvelle-Techno.fr le 4 mars 2022 - Catégories : Symfony
Lire l'article sur le site d'origine
Dans cette 7ème partie nous allons créer les contrôleurs de notre projet e-commerce.
Les contrôleurs vont servir à créer et gérer les “routes” ou les différentes adresses de notre site.
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.