Utiliser l'event kernel.request de Symfony2, analyser la route et rediriger si la route n'est pas du type "app_admin_..." par exemple. L'inconvénient de cette méthode est qu'elle est appelée à chaque request.
Créer la classe
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpFoundation\RedirectResponse;
class TestRequestListener
{
private $security;
private $router;
private $request_stack;
public function __construct($security, $router, $request_stack)
{
$this->security = $security;
$this->router = $router;
$this->request_stack = $request_stack;
}
public function onKernelRequest(GetResponseEvent $event)
{
//__ n'agir que si c'est la requête principale
if (HttpKernel::MASTER_REQUEST == $event->getRequestType()) {
$request = $this->request_stack->getCurrentRequest();
$routeName = $request->get('_route');
//__ On fait l'action en fonction de l'URL...
if( strpos($routeName, 'app_admin_') === false && $this->security->isGranted('ROLE_ADMIN') ) {
//__ Action à effectuer...
}
}
}
}
Créer le service
Dans le fichier config.yml :
kernel.listener.your_listener_name:
class: App\TestBundle\Listener\TestRequestListener
arguments: [ @security.context, @router, @request_stack ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }