2014-09-24 57 views
1

我需要记录所有用户的操作与monolog。但是,只有在动作持续数据与教条,插入,更新或删除。教义坚持后Symfony monolog

我该怎么办?我能定义一个像“afterPersist”这样的通用方法来记录每一个动作吗?

Thx!

编辑:

监听器:

use Doctrine\ODM\MongoDB\Event\OnFlushEventArgs; 
use Psr\Log\LoggerInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\Security\Core\SecurityContextInterface; 

class DatabaseLogger 
{ 
    protected $logger; 
    protected $security_context; 
    protected $request; 

    public function __construct(LoggerInterface $logger, ContainerInterface $service_container) 
    { 
     $this->logger = $logger; 
     $this->setSecurityContext($service_container->get('security.context')); 
    } 

    public function setRequest(RequestStack $request_stack) 
    { 
     $this->request = $request_stack->getCurrentRequest(); 
    } 

    public function setSecurityContext(SecurityContextInterface $security_context) 
    { 
     $this->security_context = $security_context; 
    } 

    public function onFlush(OnFlushEventArgs $args) 
    { 
     // configure this however you want 
    } 
} 

和service.yml

cc.listener.database_logger: 
    class: Cc\HitoBundle\Listener\DatabaseLogger 
    tags: 
     - { name: doctrine_mongodb.odm.event_listener, event: onFlush } 
     - { name: monolog.logger, channel: database_access } 
    calls: 
     - [ setRequest, [@request_stack] ] 
    arguments: [ @logger, @service_container ] 

我得到了一个错误,当我添加的安全上下文:

ServiceCircularReferenceException :循环参考检测ed for service“doctrine_mongodb.odm.default_document_manager”,path:“doctrine_mongodb.odm.default_document_manager - > doctrine_mongodb.odm.default_connection - > doctrine_mongodb.odm.event_manager - > cc.listener.post_persist - > security.context - > security.authentication .manager - > security.user.provider.concrete.user_db“。

回答

3

注册一个听者的东西,如:

建立一个监听器:

namespace Acme\MyBundle\EventListener; 

use Doctrine\ORM\Event\LifecycleEventArgs; 

class PersistLogger 
{ 
     public $logger; 

     public function __construct($logger) 
     { 
      $this->logger = $logger; 
     } 

     public function postPersist(LifecycleEventArgs $args) 
     { 
      // configure this however you want 
      $this->logger->addDebug('whatever'); 
     } 
} 

注册听众中config.yml

acme_mybundle.eventlistener.persistlogger: 
    class: Acme\MyBundle\EventListener\PersistLogger 
    tags: 
     - { name: doctrine.event_listener, event: postPersist } 
    argument: [ @logger ] 

编辑: 注射的安全上下文成学说听众原因如果您将用户存储在数据库中(例如使用FOSUserBundle),则为循环引用异常。这是因为安全上下文需要注入实体管理器,以便它可以从数据库获取用户,但由于监听器,实体管理器依赖于安全上下文。

解决方法是注入整个服务容器(唯一的时期之一这样做是有道理的),并从那里的安全环境:

namespace Acme\MyBundle\EventListener; 

use Psr\Log\LoggerInterface, 
    Symfony\Component\DependencyInjection\ContainerInterface, 
    Symfony\Component\Security\Core\SecurityContextInterface; 

protected $service_container; 
protected $logger; 

public function __construct(LoggerInterface $logger, ContainerInterface $service_container) 
{ 
    $this->service_container = $service_container; 
    $this->logger = $logger; 
} 

public function getSecurityContext() 
{ 
    return $this->service_container->get('security.context'); 
} 

acme_mybundle.eventlistener.persistlogger: 
    class: Acme\MyBundle\EventListener\PersistLogger 
    tags: 
     - { name: doctrine.event_listener, event: postPersist } 
    argument: [ @logger, @service_container ] 
+0

除了点你不尊重的服务的标记......一切似乎都很完美+1 – DonCallisto 2014-09-24 16:37:20

+1

@DonCallisto将它更新为点符号,因此它确实是完美的;) – 2014-09-25 10:27:47

+0

这是我的眼中的快乐:D – DonCallisto 2014-09-25 10:37:51