2012-10-05 51 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