I want to persist a Log entity (ip,url,path,user,date...) everytime a URL is requested or served. I'm getting the "EntityManager is closed" error. I'm looking for a simple solution if possible. My code is the following:
First the YAML services:
kernelListener:
    class: AppBundle\EventListener\KernelListener
    arguments: [ '@my_logger']
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
        - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }
        - { name: kernel.event_listener, event: kernel.terminate, method: onKernelTerminate }
        - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
my_logger:
    class:        AppBundle\Service\Logger
    arguments: ['@doctrine.orm.entity_manager', '@security.token_storage' ]
    scope: prototype  
Here it's my Logger service:
 namespace AppBundle\Service;
use AppBundle\Entity\Log;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
class Logger {
private $em, $token;
public function __construct(EntityManager $em, TokenStorage $token) {
    $this->em = $em;
    $this->token_storage = $token;
}
public function persist($r) {
    $log = new Log();
    $log->setAjax($r->isXmlHttpRequest());
    $log->setIp($r->getClientIp());
    $log->setMethod($r->getMethod());
    $log->setPath($path);
    $log->setUrl($r->getUri());
    if ($this->token_storage->getToken()) {
        $user = $this->token_storage->getToken()->getUser();
        if ($user instanceof \AppBundle\Entity\User) {
            $log->setUser($user);
        }
    }
    $this->em->persist($log);
    $this->em->flush();
}
}
and the KernelListener.php
 namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use AppBundle\Service\Logger;
class KernelListener {
protected $logger;
public function __construct(Logger $logger) {
    $this->logger = $logger;
}
public function onKernelRequest(GetResponseEvent $event) {
}
public function onKernelResponse(FilterResponseEvent $event) {
}
 public function onKernelController(FilterControllerEvent $event) {
    $r = $event->getRequest();
    $this->logger->persist($r);
}
public function onKernelTerminate(PostResponseEvent $event) {        
}
}
If I remove the flush() no error is thrown, but no Log in the DB logically.
 
     
    