janakdom/doctrine-log-bundle

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

安装: 14

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 11

类型:symfony-bundle

2.0.3 2021-10-22 18:06 UTC

This package is auto-updated.

Last update: 2024-09-29 06:14:35 UTC


README

从manasbala/doctrine-log-bundle分叉而来。

Symfony 扩展包,用于启用自动记录数据更改。仅与 doctrine 实体一起工作。这个扩展包将帮助开发者确定数据是如何被更改的 :)

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

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

先决条件

此扩展包使用 stof/doctrine-extensions-bundle 来使用 blameable 和 timestampable。首先安装该扩展包,并配置为使用 blamable 和 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_all & include_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 表中。

配置

如果您使用 blameable 特性或 timestampable 特性,那么您可能希望记录这些属性的更改。或者您可能有一些常见属性被添加到许多条目中,您不希望记录这些属性的更改,那么请添加此配置。

# config/packages/mb_doctrine_log.yaml

mb_doctrine_log:
  ignore_properties:
    - createdBy
    - updatedBy
    - createAt
    - updatedAt
  entity_manager: 'default'
  event_subscriber: 'Mb\DoctrineLogBundle\EventSubscriber\Logger'

此处配置的任何属性名称,如果 Loggable 实体具有该属性,则会被忽略。

数据如何保存

mb_entity_log 表中有 9 列

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

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

作者

  • 多明尼克·亚纳克