2012-10-05 20 views
7

Mi problema es el cierre de la sesión del usuario. el código de lo que tengo es:symfony2 logout

public function onAuthenticationFailure(Request $request, AuthenticationException $exception){ 

    return new Response($this->translator->trans($exception->getMessage())); 
} 

public function logout(Request $request, Response $response, TokenInterface $token) 
{ 
    $empleado = $token->getUser(); 
    $log = new Log(); 
    $log->setFechalog(new \DateTime('now')); 
    $log->setTipo("Out"); 
    $log->setEntidad(""); 
    $log->setEmpleado($empleado); 
    $this->em->persist($log); 
    $this->em->flush(); 
} 

public function onLogoutSuccess(Request $request) { 
    return new RedirectResponse($this->router->generate('login')); 
} 

El problema es que no puedo acceder al token de usuario TokenInterface cuando se está ejecutando la función de cierre de sesión?

+1

el problema soluction es el contexto de seguridad del servicio Gracias. – paradita

+1

¿'' token-> getUser() 'devuelve nulo? O el '$ token' es nulo? – Kosta

Respuesta

11

Para obtener token, debe inyectar con contexto de seguridad.

1. Crear proceso de escucha Salir de clase, algo como esto:

namespace Yourproject\Yourbundle\Services; 
... 
use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface; 
use Symfony\Component\Security\Core\SecurityContext; 

class LogoutListener implements LogoutSuccessHandlerInterface { 

    private $security; 

    public function __construct(SecurityContext $security) { 
    $this->security = $security; 
    } 

    public function onLogoutSuccess(Request $request) { 
    $user = $this->security->getToken()->getUser(); 

    //add code to handle $user here 
    //... 

    $response = RedirectResponse($this->router->generate('login')); 

    return $response; 
    } 
} 

2. Y luego, en service.yml, añada esta línea:

.... 
logout_listener: 
    class: Yourproject\Yourbundle\Services\LogoutListener 
    arguments: [@security.context] 

Eso es todo, puede ayuda.

+2

Esto no funcionará, para el servicio logout_listener no tiene un evento definido. Entonces el oyente no será despedido en absoluto. –

+0

@artworkad i, he registrado este evento en service.yml, por lo que se disparará cuando el usuario cierre la sesión. Lo he usado en varias sinfonías de proyectos, y no hay problema. – tesmojones

+1

En mi opinión, es necesario sumar TAMBIÉN las líneas en la respuesta el 24 de julio de 2014 a las 15:22. Funcionó para mí en Symfony 2.5. – ziiweb