Comment rediriger dans onSecurityInteractiveLogin méthode dans LoginListener - Symfony2

Nous voulons rediriger vers un chemin ou un autre après la connexion. Aussi, nous devons passer de la langue dans cette voie.

Nous avons une Connexion écoute comme un service pour vérifier cela. Notre problème est de faire la redirection accion.
Code:

<service id="acme.login_listener" class="acme\DemoBundle\Listener\LoginListener">
   <tag name="kernel.event_listener" event="security.interactive_login" method="onSecurityInteractiveLogin" priority="-1" />
   <tag name="kernel.event_listener" event="filter.response" method="onKernelResponse" />            
   <argument type="service" id="service_container" />  
   <argument type="service" id="router" />          
</service>

L'auditeur code:

namespace Acme\DemoBundle\Listener;

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\DependencyInjection\ContainerInterface;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;

class LoginListener 
{
    protected $container;
    protected $router;

    public function __construct(ContainerInterface $container, Router $router)
    {
        $this->container = $container;
        $this->router = $router;
    }

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {                
        $token = $event->getAuthenticationToken();
        $request = $event->getRequest();

        $username = $token->getUsername();

        $em = $this->container->get('doctrine')->getEntityManager();

        $user = $em->getRepository('acmeDemoBundle:User')->findOneByUsername($username);


        $locale = strtolower($user->getUsuari()->getIdioma()->getCodi6391());
        $locale = 'ca';  //force locale test

        $session = $request->getSession();
        $session->setLocale($locale);          
        $session->set('idioma', $locale);    
        $session->set('_locale', $locale); 
        $session->set('locale', $locale);

        $url = $this->router->generate('onePath', array('_locale' => $locale));

        //$event->setResponse(new RedirectResponse($url));
        //$event->stopPropagation();
        //echo $url;exit;

        $response = new RedirectResponse($url);            
        return $response;  
...

Notre problème est de faire la redirection vers le souhaite chemin dans onSecurityInteractiveLogin fonction.

Nous avons essayé de faire l' $event->setResponse mais ça ne fonctionne pas. Ce $event var n'ont pas cette méthode.

Une idée?
Merci pour votre aide.


Édité: deuxième option (Jan 27, 2012)

Suivantes: http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/

J'ai essayé d'utiliser des Gestionnaires. J'ai configuré l'services.xml:

<service id="company.login_success_handler" class="project\demoBundle\Handler\LoginSucessHandler">
    <tag name="monolog.logger" channel="project" />
    <argument type="service" id="logger" /> 
    <argument type="service" id="router" />          
</service>

SUR la sécurité.yml:

firewalls:
    main:
        pattern: /.*
        form_login:
            check_path: /login_check
            login_path: /login
            success_handler: company.login_success_handler
            use_forward: false

Et dans Symfony/src/project/demoBundle/Handler/loginSuccessHandler.php

<?php 

namespace project\demoBundle\Handler; 

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\SecurityContext; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Routing\Router; 

class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface 
{ 

  protected $router; 
  protected $security; 

  public function __construct(Router $router, SecurityContext $security) 
  { 
    $this->router = $router; 
    $this->security = $security; 
    echo "hello world";exit;
  } 

  public function onAuthenticationSuccess(Request $request, TokenInterface $token) 
  { 

    echo "hello world 2";exit;
    if ($this->security->isGranted('ROLE_SUPER_ADMIN')) 
    { 
      $response = new RedirectResponse($this->router->generate('category_index'));       
    } 
    elseif ($this->security->isGranted('ROLE_ADMIN')) 
    { 
      $response = new RedirectResponse($this->router->generate('category_index')); 
    }  
    elseif ($this->security->isGranted('ROLE_USER')) 
    { 
      //redirect the user to where they were before the login process begun. 
      $referer_url = $request->headers->get('referer'); 

      $response = new RedirectResponse($referer_url); 
    } 

    return $response; 
  } 

}

Mais si je exécuter l'application web, il n'est pas dans cette fonction et ne pas afficher "Hello world".

Savez-vous ce que je fais mal?
Merci!!!!

OriginalL'auteur Santi | 2012-01-23