使用原则跟踪表上的数据更改

时间:2012-09-05 10:09:29

标签: mysql doctrine

所以情况是我使用Doctrine作为我的一个项目的ORM。

现在我希望能够跟踪我网站某些表格上发生的变化,而无需额外编码。

例如。我有一个有很多表的数据库。我有一个表用户,我想跟踪完成的更改 1.用户的列名称为“Raman” 2.使用下面的update sql修改行

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

在doctrine中是否有任何内置功能允许创建一个日志表来跟踪已完成的所有数据级别更改日志?

1 个答案:

答案 0 :(得分: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,则可以在您的services.yml中将监听器注册为服务

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