janakdom / doctrine-log-bundle
Symfony 扩展包,用于启用自动记录 doctrine 实体更改。
Requires
- php: ^7.2
- doctrine/doctrine-bundle: *
- symfony/monolog-bundle: ^3.5
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 列
- id(主键)
- object_class(正在更改的类)
- foreign_key(对象的id)
- action(创建|更新|删除)
- changes(序列化的更改,键是属性名称,值是一个数组,第一个元素是旧值,第二个元素是新值)
- created_at(时间戳)
- updated_at
现在您可以选择如何向超级管理员展示这些数据。
作者
- 多明尼克·亚纳克