2012-10-05 92 views
7

我的問題是捕獲用戶註銷。什麼我的代碼是:symfony2註銷

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')); 
} 

問題是,當你正在運行的註銷功能無法訪問用戶令牌TokenInterface

+1

的soluction問題是服務的安全上下文謝謝。 – paradita

+1

'$ token-> getUser()'返回null嗎?或者'$ token'爲空? – Kosta

回答

11

要獲取令牌,必須注入安全上下文。

1.創建類註銷監聽器,像這樣:

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.然後在service.yml,加入這一行:

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

就是這樣,可能它有助於。

+2

這不起作用,對於logout_listener服務你沒有定義的事件。所以聽衆不會被解僱。 –

+0

@artworkadシ,我已經在service.yml上註冊了這個事件,所以當用戶註銷時它會被觸發。我已經在幾個項目交響樂中使用過這個,並且沒有問題。 – tesmojones

+1

在我看來,有必要在14年7月24日在15:22添加答案中的行。它在symfony 2.5中爲我工作。 – ziiweb