Les controlleurs avec Symfony 6

Un contrôleur est une fonction PHP que vous créez et qui lit les informations de l’objet Request et crée et renvoie un objet Response. La réponse peut être une page HTML, JSON, XML, un téléchargement de fichier, une redirection, une erreur 404 ou autre. Le contrôleur exécute toute logique arbitraire dont votre application a besoin pour rendre le contenu d’une page.

Si vous n’avez pas encore créé votre première page fonctionnelle, consultez Créer votre première page en Symfony et revenez ensuite !

Un contrôleur de base

Bien qu’un contrôleur puisse être n’importe quel appelable PHP (fonction, méthode sur un objet, ou un Closure), un contrôleur est généralement une méthode à l’intérieur d’une classe de contrôleur :

// src/Controller/LuckyController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class LuckyController
{
    /**
     * @Route("/lucky/number/{max}", name="app_lucky_number")
     */
    public function number(int $max): Response
    {
        $number = random_int(0, $max);

        return new Response(
            '<html><body>Lucky number: '.$number.'</body></html>'
        );
    }
}

Le contrôleur est la méthode number(), qui se trouve dans la classe de contrôleur LuckyController.

Ce contrôleur est assez simple :

  • ligne 2 : Symfony profite de la fonctionnalité d’espace de noms de PHP pour nommer la classe de contrôleur entière.
  • ligne 4 : Symfony profite à nouveau de la fonctionnalité d’espace de noms de PHP : le mot-clé use importe la classe Response, que le contrôleur doit retourner.
  • ligne 7 : La classe peut techniquement s’appeler n’importe quoi, mais elle est suffixée par Controller par convention.
  • ligne 12 : La méthode d’action est autorisée à avoir un argument $max grâce au wildcard {max} dans la route.
  • ligne 16 : Le contrôleur crée et retourne un objet Response.

Mappage d’une URL à un contrôleur

Afin d’afficher le résultat de ce contrôleur, vous devez lui associer une URL via une route. Cela a été fait ci-dessus avec l’annotation de route @Route(« /lucky/number/{max} »).

Pour voir votre page, allez à l’URL suivante dans votre navigateur : http://localhost:8000/lucky/number/100

Pour plus d’informations sur le routage, voir Routage.

La classe de contrôleur de base et les services

Pour faciliter le développement, Symfony est livré avec une classe de contrôleur de base optionnelle appelée AbstractController. Elle peut être étendue pour avoir accès aux méthodes d’aide.

Ajoutez la déclaration d’utilisation à votre classe de contrôleur et modifiez ensuite LuckyController pour l’étendre :

// src/Controller/LuckyController.php
  namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;


class LuckyController extends AbstractController
  {
      // ...
  }

Voilà, c’est fait ! Vous avez maintenant accès à des méthodes comme $this->render() et à bien d’autres que vous allez découvrir par la suite.

Génération d’URLs

La méthode generateUrl() est juste une méthode d’aide qui génère l’URL pour une route donnée :

$url = $this->generateUrl('app_lucky_number', ['max' => 10]);

Redirection

Si vous souhaitez rediriger l’utilisateur vers une autre page, utilisez les méthodes redirectToRoute() et redirect() :

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response

// ...
public function index(): RedirectResponse
{
    // redirects to the "homepage" route
    return $this->redirectToRoute('homepage');

    // redirectToRoute is a shortcut for:
    // return new RedirectResponse($this->generateUrl('homepage'));

    // does a permanent HTTP 301 redirect
    return $this->redirectToRoute('homepage', [], 301);
    // if you prefer, you can use PHP constants instead of hardcoded numbers
    return $this->redirectToRoute('homepage', [], Response::HTTP_MOVED_PERMANENTLY);

    // redirect to a route with parameters
    return $this->redirectToRoute('app_lucky_number', ['max' => 10]);

    // redirects to a route and maintains the original query string parameters
    return $this->redirectToRoute('blog_show', $request->query->all());

    // redirects externally
    return $this->redirect('http://symfony.com/doc');
}