kricha/doctrine-audit-bundle

此扩展包为所有 doctrine ORM 数据库相关更改创建审计日志。

安装次数: 3,628

依赖项: 0

建议者: 0

安全性: 0

星级: 9

关注者: 2

分支: 2

开放问题: 1

类型:symfony-bundle

0.3.12 2022-02-05 18:15 UTC

README

灵感来源

此扩展包为所有 Doctrine ORM 数据库相关更改创建审计日志

  • 包括它们的差异以及关系字段的差异。
  • 多对多关系更改,关联和解关联操作。
  • 如果令牌存储中有用户,则使用该用户来识别更改的用户。
  • flush 期间将审计条目插入到同一事务中,如果发生错误,状态保持干净。

基本上,如果您通过标准 ORM 操作管理这些日志条目,您可以跟踪任何更改。

注意:审计无法跟踪 DQL 或直接 SQL 更新或删除语句的执行。

此扩展包受 damienharper/doctrine-audit-bundlesimplethings/entity-audit-bundle 的启发。

安装

使用 Symfony Flex 的应用程序

打开命令行,进入您的项目目录并执行

composer require kricha/doctrine-audit-bundle

不使用 Symfony Flex 的应用程序

步骤 1: 下载扩展包

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

composer require kricha/doctrine-audit-bundle

此命令要求您全局安装 Composer,如 Composer 文档中的安装章节所述。

步骤 2: 启用扩展包

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

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new Kricha\DoctrineAuditBundle\KrichaDoctrineAuditBundle(),
            new BabDev\PagerfantaBundle\BabDevPagerfantaBundle(), // only required if you plan to use included viewer/templates
        );

        // ...
    }

    // ...
}

配置

被审计的实体和属性

默认情况下,DoctrineAuditBundle 不会审计任何实体,您必须配置哪些实体需要被审计。

// app/config/config.yml (symfony < 3.4)
// config/packages/kricha_doctrine_audit.yaml (symfony >= 3.4)
kricha_doctrine_audit:
    entities:
        App\Entity\Order: ~
        App\Entity\User: ~

所有 OrderUser 属性都将被审计。尽管可以排除一些属性不进行审计。

// app/config/config.yml (symfony < 3.4)
// config/packages/kricha_doctrine_audit.yaml (symfony >= 3.4)
kricha_doctrine_audit:
    entities:
        App\Entity\Order: ~   # all MyAuditedEntity1 properties are audited
        App\Entity\User:
            ignored_columns:                  # properties ignored by the audit process
                - createdAt
                - updatedAt

还可以指定审计过程中全局忽略的属性。

// app/config/config.yml (symfony < 3.4)
// config/packages/kricha_doctrine_audit.yaml (symfony >= 3.4)
kricha_doctrine_audit:
    ignored_columns:    # properties ignored by the audit process in any audited entity
        - createdAt
        - updatedAt

审计表命名格式

审计表名称由前缀、被审计的表名称和后缀组成。默认情况下,前缀为空,后缀为 _audit。尽管可以自定义。

// app/config/config.yml (symfony < 3.4)
// config/packages/kricha_doctrine_audit.yaml (symfony >= 3.4)
kricha_doctrine_audit:
    table_prefix: ''
    table_suffix: '_audit'

创建审计表

打开命令行,进入您的项目目录,然后执行以下命令以审查更新模式队列中的新审计表。

# symfony < 3.4
app/console doctrine:schema:update --dump-sql
# symfony >= 3.4
bin/console doctrine:schema:update --dump-sql

注意:DoctrineAuditBundle 目前仅与名为 "default" 的 DBAL 连接和 EntityManager 一起使用。

使用 Doctrine Migrations Bundle

# symfony < 3.4
app/console doctrine:migrations:diff
app/console doctrine:migrations:migrate
# symfony >= 3.4
bin/console doctrine:migrations:diff
bin/console doctrine:migrations:migrate

使用 Doctrine 模式

# symfony < 3.4
app/console doctrine:schema:update --force
# symfony >= 3.4
bin/console doctrine:schema:update --force

审计查看器

将以下路由添加到路由配置中,以启用包含的审计查看器。

// app/config/routing.yml (symfony < 3.4)
// config/routes.yaml (symfony >= 3.4)
kricha_doctrine_audit:
    resource: "@KrichaDoctrineAuditBundle/Controller/"
    type: annotation

可以在获取结果之前通过调用 AuditReader::filterBy 方法来通过事件类型过滤结果。

可用的常量包括

    AuditManager::INSERT
    AuditManager::UPDATE
    AuditManager::DELETE
    AuditManager::ASSOCIATE
    AuditManager::DISSOCIATE

自定义用户提供者

如果您不使用 Symfony 的 TokenStorage 来保存您的当前用户,则可以配置更改的自定义用户名。

use App\Entity\Order;
use Doctrine\ORM\EntityManagerInterface;
use Kricha\DoctrineAuditBundle\AuditConfiguration;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class TestController extends AbstractController
{
    /**
     * @Route("/")
     */
    public function index(EntityManagerInterface $entityManager, AuditConfiguration $auditConfiguration)
    {
        $auditConfiguration->setUsernameCallable(
            static function () {
                return '[ControllerChanger]';
            }
        );
        $order      = $this->entityManager->find(Order::class, 1);
        $order->setComment(\uniqid());
        $entityManager->persist($order);
        $entityManager->flush();

        return $this->render('index.html.twig', ['hello' => 'wolrd']);
    }
}

用法

当您运行模式更新或类似操作时,审计实体将自动映射。之后,所有数据库更改都将反映在审计日志中。

常见问题解答 (FAQ)

我在配置文件中添加了一个新的实体,但它没有被审计。

首先检查其命名空间,然后清除您的缓存,并重新运行 doctrine:schema:updatedoctrine:migrations:migrate

贡献

DoctrineAuditBundle 是一个开源项目。我们欢迎社区的贡献。请向我们发送您的想法、代码审查、pull requests 和功能请求,以帮助我们改进此项目。

在为此项目贡献时,请不要忘记提供单元测试。

许可证

DoctrineAuditBundle 可免费使用,并受 MIT 许可证 的许可。