2012-09-05 38 views
3

所以情況是我使用Doctrine作爲我的一個項目的ORM。使用原則追蹤表格數據變化

現在我希望能夠跟蹤我網站某些表格上發生的變化,而無需額外編碼。

例如,我有一個有很多表的數據庫。出來的,我有一個表的用戶上,我要跟蹤完成 1.用戶的變化有列名和值「拉曼」 2.使用更新SQL下面我修改行

update users set name = 'Raman Joshi' where name='Raman'

是有沒有在doctrine中的內置功能,允許創建一個日誌表跟蹤所有數據級別更改日誌完成?

+0

在提出問題之前,請務必查看文檔。如果你的任務不是非常複雜,你總能找到解決方案。查看[documentation](http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/events.html)的[this section](http:// docs。 doctrine-project.org/projects/doctrine-orm/en/2.0.x/index.html) – Leri

+0

Doctrine的哪個版本? – j0k

+0

Doctrine 2.0是版本 – thebestcoders

回答

2

您可以使用Doctrine preUpdate event listener來做到這一點。這裏有一個簡單的例子,將更改發送到記錄器:

use Psr\Log\LoggerInterface as Logger; 
use Doctrine\ORM\Event\PreUpdateEventArgs; 

class ChangeLoggerListener 
{ 
    protected $logger; 

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

    public function preUpdate(PreUpdateEventArgs $eventArgs) 
    { 
     //find out class and id of object being updated 
     $obj=$eventArgs->getEntity(); 
     $class=get_class($eventArgs->getEntity()); 
     $id=$obj->getId(); 
     $log="$class($id) updated: "; 

     //find out what has changed... 
     $changes=$eventArgs->getEntityChangeSet(); 
     $separator=''; 
     foreach ($changes as $field => $values) { 
      $log.=$separator."$field changed from {$values[0]} to {$values[1]}"; 
      $separator=", "; 
     } 

     //send it to logger 
     $this->logger->info($log); 
    } 
} 

手冊頁顯示如何註冊監聽器,但如果你使用的Symfony,你可以監聽在你的服務,這樣的服務註冊.yml

my.change_logger: 
    class: My\ExampleBundle\Listener\ChangeLoggerListener 
    arguments: [@logger] 
    tags: 
     - { name: doctrine.event_listener, event: preUpdate }