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 %}