Bien qu'un contrôleur puisse être une classe normale, il est conseillé d'étendre la classe Controller ou AbstractController, pour bénéficier des méthodes utilitaires définies dans ces classes.
namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class LuckyController extends Controller { // ... }
$url = $this->generateUrl('app_lucky_number', array('max' => 10));
use Symfony\Component\HttpFoundation\RedirectResponse; // ... public function index() { // redirect to the "homepage" route return $this->redirectToRoute('homepage'); // redirectToRoute is a shortcut for: // return new RedirectResponse($this->generateUrl('homepage')); // do a permanent - 301 redirect return $this->redirectToRoute('homepage', array(), 301); // redirect to a route with parameters return $this->redirectToRoute('app_lucky_number', array('max' => 10)); // redirect externally return $this->redirect('http://symfony.com/doc'); }
// renders templates/lucky/number.html.twig return $this->render('lucky/number.html.twig', array('name' => $name));
L'utilisation d'un service peut se faire par injection de dépendances :
use Psr\Log\LoggerInterface // ... /** * @Route("/lucky/number/{max}") */ public function number($max, LoggerInterface $logger) { $logger->info('We are logging!'); // ... }
La commande suivante liste les services directement injectables :
php bin/console debug:autowiring
L'objet request est utilisable par injection de dépendance :
use Symfony\Component\HttpFoundation\Request; public function index(Request $request, $firstName, $lastName) { $page = $request->query->get('page', 1); // ... }
ou en utilisant la méthode statique :
$request = Request::createFromGlobals();
L'utilisation de la session se fait par injection de dépendance d'une instance de SessionInterface :
use Symfony\Component\HttpFoundation\Session\SessionInterface; public function index(SessionInterface $session){ // store an attribute for reuse during a later user request $session->set('foo', 'bar'); // get the attribute set by another controller in another request $foobar = $session->get('foobar'); // use a default value if the attribute doesn't exist $filters = $session->get('filters', array()); }
Les Flash messages permettent de communiquer des notifications à l'utilisateur. Ils sont stockés en session, et supprimés automatiquement après leur utilisation (get) :
Exemple d'utilisation de création de flash message lors de l'envoi d'un formulaire :
use Symfony\Component\HttpFoundation\Request; public function update(Request $request) { // ... if ($form->isSubmitted() && $form->isValid()) { // do some sort of processing $this->addFlash( 'notice', 'Your changes were saved!' ); // $this->addFlash() is equivalent to $request->getSession()->getFlashBag()->add() return $this->redirectToRoute(...); } return $this->render(...); }
Affichage des flash messages dans un template :
{# templates/base.html.twig #} {# you can read and display just one flash message type... #} {% for message in app.flashes('notice') %} <div class="flash-notice"> {{ message }} </div> {% endfor %} {# ...or you can read and display every flash message available #} {% for label, messages in app.flashes %} {% for message in messages %} <div class="flash-{{ label }}"> {{ message }} </div> {% endfor %} {% endfor %}