igoooor / doctrine-log-bundle
Symfony 扩展包,用于启用自动记录 doctrine 实体变化。
Requires
- php: ^7.1.3|^8.0
- jms/serializer-bundle: ^3.4
- stof/doctrine-extensions-bundle: ^1.3
- symfony/monolog-bundle: ^3.5
- symfony/orm-pack: *
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_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
表中。
配置
如果您正在使用可归责特性或时间戳特性,那么您可能希望记录这些属性的变化。或者,您可能有一些在许多条目中添加的通用属性,您不希望记录这些属性的变化,那么请添加此配置。可以配置不同的实体管理器以支持多个实体管理器。监听服务可以被扩展以进行任何必要的更改。
# 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列
- id(主键)
- object_class(被更改的类)
- foreign_key(对象的ID)
- action(创建|更新|删除)
- changes(序列化的更改,键是属性名称,值是一个数组,第一个元素是旧值,第二个元素是新值)
- created_by(应负责的用户)
- updated_by(应负责的用户)
- created_at(时间戳)
- updated_at
现在您可以选择如何向超级管理员显示这些数据。