如何优雅地登录Doctrine2实体

时间:2014-09-01 14:25:59

标签: symfony doctrine-orm

考虑以下情况。我有一个持有一些信息的实体,让我们说一个新闻。此新闻包含评论。

在新闻项实体中,有calculateStatistics()函数,它返回从新闻项实体派生的一些统计信息及其注释。我以前在NewsService内有这个计算函数,但后来发现不需要服务,因为我只使用实体内部的信息。

如今,计算功能也进行了一些健全性检查。我想在我的Monolog服务中将负面结果记录为警告。我仍然相信在这一点上,在实体内部有这个计算功能是有效的,因为不需要外部信息/服务。是否有一种优雅的方式来支持实体内部的日志记录?

1 个答案:

答案 0 :(得分:2)

我不认为在Entity中处理日志记录是一个好主意,因为实体应尽可能独立并且内部没有业务逻辑。我建议event listener来做。考虑这样的配置(我假设您正在使用Doctrine并希望在某些教条事件中执行日志记录 - 但如果没有,您只需要修改您收听的事件的名称):

<强>实体:

class YourEntity implements StatisticInterface
{
    (...)
    public function calculateStatistics()
    {
        (...)
    }

}

<强> config.yml

your_service.statistics_listener:
       class: Acme\DemoBundle\EventListener\Entity\StatisticsEntityListener
       arguments: [@logger]
       tags:
           - { name: doctrine.event_listener, event: prePersist }

prePersistmany个可能事件中的一个,只需选择最适合的事件

<强> StatisticsEntityListener

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

    /**
     * @param LifecycleEventArgs $args
     */
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof StatisticInterface) {
            //do whatever you like with your logger and entity
            $logger->log($entity->calculateStatistics());
        }
    }
}

通过这种方式,您可以很好地分离关注点,并且您可以使用Monolog

记录信息