Php Symfony在不活动后注销,创建日志条目

Php Symfony在不活动后注销,创建日志条目,php,symfony,Php,Symfony,基于问题 我已经实现了一个自动注销用户后,一段时间的不活动(如上述问题)。这很好,但我需要为此事件创建一个日志条目 问题是,当注销触发时,我在日志文件中得到多条记录,而不是一条记录。我想我需要听一些其他的请求,而不是onKernelRequest。有什么办法吗?我的代码如下: <?php namespace AppBundle\EventListener; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\

基于问题

我已经实现了一个自动注销用户后,一段时间的不活动(如上述问题)。这很好,但我需要为此事件创建一个日志条目

问题是,当注销触发时,我在日志文件中得到多条记录,而不是一条记录。我想我需要听一些其他的请求,而不是
onKernelRequest
。有什么办法吗?我的代码如下:

<?php
namespace AppBundle\EventListener;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Core\Exception\CredentialsExpiredException;

class RequestListener{

protected $session;
protected $securityToken;
protected $router;
protected $logger;
protected $maxIdleTime;


public function __construct(Session $session, TokenStorage $securityToken, RouterInterface $router, $logger, $maxIdleTime)
{
    $this->session = $session;
    $this->securityToken = $securityToken;
    $this->router = $router;
    $this->logger = $logger;
    $this->maxIdleTime = $maxIdleTime;
}

public function onKernelRequest(GetResponseEvent $event)
{
    if (HttpKernelInterface::MASTER_REQUEST != $event->getRequestType()) {

        return;
    }

    if ($this->maxIdleTime > 0) {
        $lapse = time() - $this->session->getMetadataBag()->getCreated();

        if ($lapse > $this->maxIdleTime) {
            $username = $this->securityToken->getToken()->getUser();
            if ($username !== 'anon.'){
                $username = $username->getUsername();
            }

            $this->securityToken->setToken(null);

            $this->session->getFlashBag()->set('error', 'Your session expired, you need to login again');
            $this->session->invalidate();
            $this->logger->makelog(//I get multiple log entries here instead of 1
                0,
                'Session timeout',
                $username
            );
            $event->setResponse(new RedirectResponse($this->router->generate('login')));
        }
    }
}
}

您将需要创建一个定制的
LogoutListener
,它在特定事件(显然是注销)上执行您想要的操作。这里有一个很好的例子:谢谢你的回复。我为我的问题添加了一个更新,请看上面你有没有发现这个问题?谢谢是的,问题出在cookie_lifetime参数(在config.yml中)和会话_lifetime(在parameters.yml中)。cookie_生存期参数应显著高于会话_生存期
<?php

namespace AppBundle\EventListener;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Http\Logout\LogoutHandlerInterface;
use Doctrine\ORM\EntityManager;

class LogoutListener implements LogoutHandlerInterface
{
protected $securityContext;
protected $entityManager;
protected $logger;

public function __construct(TokenStorage $securityContext, EntityManager $entityManager, $logger)
{
    $this->securityContext = $securityContext;
    $this->entityManager = $entityManager;
    $this->logger = $logger;
}

public function logout(Request $Request, Response $Response, TokenInterface $Token)
{
    $em = $this->entityManager;
    $user = $this->securityContext->getToken()->getUser();
    $this->logger->makelog(1, 'Logout action, logout button', $user);
}
}