2012-10-05 18 views
7

Mein Problem ist Capture User Logout. der Code, was ich habe, ist: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')); 
} 

Das Problem ist, ich nicht das Benutzertoken TokenInterface zugreifen können, wenn Sie die Logout-Funktion ausgeführt werden?

+1

das soluction Problem ist der Service Sicherheitskontext Vielen Dank. – paradita

+1

Ist '$ token -> getUser()' null? Oder der '$ token' ist null? – Kosta

Antwort

11

Um Token zu erhalten, müssen Sie mit Sicherheitskontext injizieren.

1. Erstellen Klasse Logout Hörer, so etwas wie folgt aus:

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. Und dann in service.yml, fügen Sie diese Zeile:

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

Das ist es, so kann es hilft.

+2

Dies funktioniert nicht, für den Dienst logout_listener haben Sie kein definiertes Ereignis. Also wird der Zuhörer überhaupt nicht gefeuert. –

+0

@artworkad シ, ich habe dieses Ereignis bei service.yml registriert, so dass es ausgelöst wird, wenn sich der Benutzer abmeldet. Ich habe das auf mehreren Projekt Symphony verwendet, und es gibt kein Problem. – tesmojones

+1

Meiner Meinung nach ist es notwendig, ALSO die Zeilen in der Antwort am 24. Juli 14 um 15:22 hinzuzufügen. Es hat bei symfony 2.5 funktioniert. – ziiweb