Nouvelle-Techno.fr

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 :

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 :

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 Guilded pour une entraide par chat.

#Routes #Symfony #controleur #symfony6