Nos premières pages — Formation Symfony 7

Dans ce nouveau chapitre nous allons voir ensemble le fonctionnement du Routing et nous allons créer nos premières pages.

Controller

Pour créer une page on va commencer par créer un Controller. C’est une classe qui va contenir des méthodes permettant de répondre à une requête utilisateur.

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;

class HomeController {

    public function index (): Response
    {
        return new Response('Bonjour les gens');
    }

}

Une fois ce controller créé il va falloir indiquer au framework quelle URL correspondra à quelle action. Cela peut se faire de 2 manières.

routes.yaml

Dans le dossier config, on peut éditer le fichier routes.yaml pour enregistrer notre route.

home:
    path: /
    controller: App\Controller\HomeController::index

Attribut PHP

Les routes peuvent aussi être définit en utilisant des attributs PHP directement au niveau des méthodes de notre controller.

<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class HomeController {

    #[Route("https://grafikart.fr/", name: "home")]
    function index (): Response 
    {
        return new Response('Bonjour les gens');
    }

}

Objet Request

Maintenant, comment ça se passe si on veut gérer des paramètre dans l’url ? Par exemple ?name=john. Par défaut, ce qu’on ferait dans une application PHP standard, c’est qu’on mettrait un appel à $_GET et on irait récupérer la clef name. Ce n’est pas la bonne manière de faire ça dans le cadre d’une application Symfony. Avec le framework, lorsque j’utilise une fonction, je peux lui injecter un paramètre supplémentaire qui va permettre de récupérer les informations sur la requête. Ce paramètre devra être de type Symfony\Component\HttpFoundation\Request.

<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class HomeController {c

    #[Route("https://grafikart.fr/", name: "home")]
    function index (Request $request): Response 
    {
        return new Response('Bonjour ' . $request->query->get('name', 'Anonyme'));
    }

}

Dès lors que l’on veut récupérer des informations sur la requête de l’utilisateur on utilisera cet objet.
On aura l’occasion de revenir sur cet objet Request et ses méthodes plus tard.

URL dynamiques

Maintenant, ce qu’on aimerait bien faire c’est avoir des URLs qui soient plus proches de la réalité. Par exemple, si je me rends sur un blog, souvent les urls des articles contiennent un slug suivi d’un ID.

https://grafikart.fr/tutoriels/mon-premier-article-32

Et on aimerait bien faire pareil avec notre Routing, pour cela on va déclarer une nouvelle route qui aura des paramètre mis entre accolades.

#[Route('/recettes/{slug}-{id}', name: 'recipe.show', requirements: ['id' => '\d+', 'slug' => '[a-z0-9-]+'])]
public function index (Request $request): Response
{

}

Les paramètres sont ensuite accessible dans l’objet requête.

$request->attributes->get('id')

Mais peuvent aussi être automatiquement injecté en modifiant les paramètre de la fonctions.

#[Route('/recettes/{slug}-{id}', name: 'recipe.show', requirements: ['id' => '\d+', 'slug' => '[a-z0-9-]+'])]
public function index (Request $request, string $slug, int $id): Response
{

}