3

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

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

例如。我有一个有很多表的数据库。除此之外,我有一个表 users,我想在其上跟踪所做的更改 1. users 的列名称为“Raman” 2. 使用下面的更新 sql 我修改了行

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

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

4

1 回答 1

2

您可以使用 Doctrine preUpdate 事件侦听器来执行此操作。这是一个将更改发送到记录器的简单示例:

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 }
于 2014-10-28T15:04:06.650 回答