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');
}