2014-09-01 52 views
1

請考慮以下情況。我有一個擁有一些信息的實體,讓我們說一個新聞項目。這個新聞項目包含評論。如何優雅地登錄Doctrine2實體

在新聞項目實體中,有calculateStatistics()函數,它返回從新聞項目實體派生的一些統計量及其評論。我曾經在NewsService裏有這個計算函數,但後來發現一個服務並不需要,因爲我只使用實體內部的信息。

現在,計算功能也做了一些理智的檢查。我想在Monolog服務中記錄負面結果作爲警告。我仍然相信,在這個實體內部有這個計算函數是有效的,因爲不需要外部信息/服務。有沒有一種優雅的方式來支持實體內部的日誌記錄?

+1

不要太在意的嘲諷,但登錄信息..優雅的方式不是從實體登錄;)計算爲什麼不是,但不記錄。請注意,Doctrine允許加載部分實體,以便某些屬性可以爲NULL,而它們在DB中被賦值,因此實體中的計算甚至不是一個好主意。使用事件自動執行此過程似乎是一種好方法。 – AlterPHP 2014-09-01 21:46:35

+0

我認爲這是一個很好的問題。現在,我們實體中的域邏輯會拋出異常,這會在未知的地方崩潰我們的應用程序。我們還可以返回合理的默認值,並讓這些實體在這些情況中記錄這些事件。 – Rvanlaak 2017-04-19 08:45:53

回答

1

我不認爲在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