igoooor/doctrine-log-bundle

Symfony 扩展包,用于启用自动记录 doctrine 实体变化。

dev-main 2022-03-14 10:16 UTC

This package is auto-updated.

Last update: 2024-09-29 06:20:26 UTC


README

在等待与 Symfony 5 兼容时,从https://github.com/manasbala/doctrine-log-bundle 分支而来

DoctrineLogBundle

Symfony 扩展包,用于启用自动记录数据变化。仅适用于 doctrine 实体。这个扩展包将帮助开发者确定数据如何发生变化 :)。

通常项目需要记录变化以查看对象上所做的完整变更历史。这主要用于超级管理员需要知道这些信息。为了从中央位置控制并自动记录这些变化,开发了此扩展包。在使用此扩展包的 symfony 项目中,您可以选择希望自动记录的实体。此扩展包将在数据每次更改时自动插入一条记录。您可以使用两种策略配置要跟踪的属性。

此扩展包已在 symfony 4 上进行测试

先决条件

此扩展包使用 stof/doctrine-extensions-bundle 来使用 blameable 和 timestampable。首先安装扩展包,并配置为使用 blameable 和 timestampable。在此处阅读安装指南 https://symfony.com.cn/doc/master/bundles/StofDoctrineExtensionsBundle/index.html

安装

请确保已全局安装 Composer,如 Composer 文档中的安装章节所述。

使用 Symfony Flex 的应用程序

打开命令行界面,进入您的项目目录,并执行以下命令

$ composer require manasbala/doctrine-log-bundle

未使用 Symfony Flex 的应用程序

步骤 1: 下载扩展包

打开命令行界面,进入您的项目目录,并执行以下命令以下载此扩展包的最新稳定版本

$ composer require manasbala/doctrine-log-bundle

步骤 2: 启用扩展包

然后,通过将其添加到项目 config/bundles.php 文件中注册的扩展包列表来启用扩展包

// config/bundles.php

return [
    // ...
    Mb\DoctrineLogBundle\MbDoctrineLogBundle::class => ['all' => true],
];

步骤 3: 更新数据库

它将在您的数据库中创建 mb_entity_log

$ php bin/console doctrine:schema:update --force

步骤 4: 配置需要记录变化的实体

在您想要记录变化的实体中添加 @Loggable 注解。默认策略将是 include_all,所有属性变化都将被记录。

// src/Entity/User.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Mb\DoctrineLogBundle\Annotation\Loggable;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="user")
 *
 * @Loggable
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

}

策略

有两种策略:exclude_allinclude_all。排除所有将自动跳过所有属性,而包含所有将自动记录所有属性。

策略仅用于更新。创建和删除操作始终记录。

如果您想排除所有属性,但只想记录一个属性,则使用策略 exclude_all 并仅在该属性中使用 @Log 注解。

// src/Entity/User.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Mb\DoctrineLogBundle\Annotation\Log;
use Mb\DoctrineLogBundle\Annotation\Loggable;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="user")
 *
 * @Loggable(strategy="exclude_all")
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="text", column="name")
     * @Log
     */
    protected $name;

    /**
     * @ORM\Column(type="text", column="user_name")
     */
    protected $username;

}

上述示例将仅记录 $name 属性。

如果您想记录所有内容,但跳过一个属性,则使用策略 include_all 并在该属性中使用 @Exclude 注解来跳过该属性。

// src/Entity/User.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Mb\DoctrineLogBundle\Annotation\Exclude;
use Mb\DoctrineLogBundle\Annotation\Loggable;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="user")
 *
 * @Loggable(strategy="include_all")
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="text", column="name")
     * @Exclude
     */
    protected $name;

    /**
     * @ORM\Column(type="text", column="user_name")
     */
    protected $username;

}

到此为止,现在它将开始自动记录实体变化,并将存储在 mb_entity_log 表中。

配置

如果您正在使用可归责特性或时间戳特性,那么您可能希望记录这些属性的变化。或者,您可能有一些在许多条目中添加的通用属性,您不希望记录这些属性的变化,那么请添加此配置。可以配置不同的实体管理器以支持多个实体管理器。监听服务可以被扩展以进行任何必要的更改。

# config/packages/mb_doctrine_log.yaml

mb_doctrine_log:
  ignore_properties:
    - createdBy
    - updatedBy
    - createAt
    - updatedAt
  entity_manager: 'default'
  listener_class: 'Mb\DoctrineLogBundle\EventListener\Logger'

您在此处配置的任何属性名称,如果可记录的实体具有该属性,将被忽略。

数据将如何保存

mb_entity_log 表中,有9列

  1. id(主键)
  2. object_class(被更改的类)
  3. foreign_key(对象的ID)
  4. action(创建|更新|删除)
  5. changes(序列化的更改,键是属性名称,值是一个数组,第一个元素是旧值,第二个元素是新值)
  6. created_by(应负责的用户)
  7. updated_by(应负责的用户)
  8. created_at(时间戳)
  9. updated_at

现在您可以选择如何向超级管理员显示这些数据。