考虑以下情况。我有一个持有一些信息的实体,让我们说一个新闻。此新闻包含评论。
在新闻项实体中,有calculateStatistics()
函数,它返回从新闻项实体派生的一些统计信息及其注释。我以前在NewsService
内有这个计算函数,但后来发现不需要服务,因为我只使用实体内部的信息。
如今,计算功能也进行了一些健全性检查。我想在我的Monolog服务中将负面结果记录为警告。我仍然相信在这一点上,在实体内部有这个计算功能是有效的,因为不需要外部信息/服务。是否有一种优雅的方式来支持实体内部的日志记录?
答案 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 }
prePersist
是many个可能事件中的一个,只需选择最适合的事件
<强> 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