我不認爲在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
不要太在意的嘲諷,但登錄信息..優雅的方式不是從實體登錄;)計算爲什麼不是,但不記錄。請注意,Doctrine允許加載部分實體,以便某些屬性可以爲NULL,而它們在DB中被賦值,因此實體中的計算甚至不是一個好主意。使用事件自動執行此過程似乎是一種好方法。 – AlterPHP 2014-09-01 21:46:35
我認爲這是一個很好的問題。現在,我們實體中的域邏輯會拋出異常,這會在未知的地方崩潰我們的應用程序。我們還可以返回合理的默認值,並讓這些實體在這些情況中記錄這些事件。 – Rvanlaak 2017-04-19 08:45:53