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.