herdwatch/entity-audit-bundle

Doctrine 实体审计

安装次数: 60 059

依赖关系: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 261

类型:symfony-bundle

v1.9.2 2023-01-20 11:45 UTC

README

此 Doctrine 2 扩展程序受 Hibernate Envers 启发,并允许实体及其关联的完整版本控制。

Latest Stable Version Latest Unstable Version License

Total Downloads Monthly Downloads Daily Downloads

支持

有关一般支持和问题,请使用 StackOverflow

如果您认为您发现了一个错误或您有一个要提出的功能想法,请自由地打开一个问题,在查看 贡献指南 之后。

许可证

此包可在 LGPL 许可证 下使用。

它是如何工作的?

数据库表审计或版本控制有几种不同的方法。此扩展程序为每个要审计的实体的表创建一个镜像表,该表以 "_audit" 后缀结尾。除了要审计的实体的所有列之外,还有两个字段

  • rev - 包含从 "revisions" 表生成的全局修订号。
  • revtype - 包含 'INS'、'UPD' 或 'DEL' 之一,作为信息表明是哪种数据库操作导致了此修订日志条目。

全局修订表包含 id、时间戳、用户名和更改注释字段。

通过这种方法,可以在特定时间点对应用程序及其对关联的更改进行版本控制。

此扩展程序会挂钩到 SchemaTool 生成过程,以便自动为您要审计的实体创建必要的 DDL 语句。

安装

安装包

简单地运行,假设您有 composer

$ composer require sonata-project/entity-audit-bundle

启用包

最后,在内核中启用包

// config/bundles.php

return [
    //...
    SimpleThings\EntityAudit\SimpleThingsEntityAuditBundle::class => ['all' => true],
    //...
];

配置

加载扩展 "simple_things_entity_audit" 并指定要审计的实体

# config/packages/entity_audit.yaml

simple_things_entity_audit:
    audited_entities:
        - MyBundle\Entity\MyEntity
        - MyBundle\Entity\MyEntity2

如果您需要排除某些实体属性以触发修订,请使用

# config/packages/entity_audit.yaml

simple_things_entity_audit:
    global_ignore_columns:
        - created_at
        - updated_at

为了使用除 "default" 之外的其他连接或实体管理器,请使用以下设置

# config/packages/entity_audit.yaml

simple_things_entity_audit:
    connection: custom
    entity_manager: custom

创建新表

调用以下命令以查看更新架构队列中的新表。

./bin/console doctrine:schema:update --dump-sql

独立安装

对于独立使用,您必须将待审计的实体类名称传递给 MetadataFactory 实例,并配置两个事件监听器。

use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager;
use Doctrine\Common\EventManager;
use SimpleThings\EntityAudit\AuditConfiguration;
use SimpleThings\EntityAudit\AuditManager;
use SimpleThings\EntityAudit\Tests\ArticleAudit;
use SimpleThings\EntityAudit\Tests\UserAudit;

$auditConfig = new AuditConfiguration();
$auditConfig->setAuditedEntityClasses([ArticleAudit::class, UserAudit::class]);
$auditConfig->setGlobalIgnoreColumns(['created_at', 'updated_at']);

$eventManager = new EventManager();
$auditManager = new AuditManager($auditConfig);
$auditManager->registerEvents($eventManager);

$config = new Configuration();
// $config ...
$connection = [];
$entityManager = EntityManager::create($connection, $config, $eventManager);

使用

查询审计信息是通过使用 SimpleThings\EntityAudit\AuditReader 实例完成的。

use SimpleThings\EntityAudit\AuditReader;

class DefaultController extends Controller
{
    public function indexAction(AuditReader $auditReader)
    {
    }
}

在独立应用程序中,您可以从审计管理器创建审计读取器

$auditReader = $auditManager->createAuditReader($entityManager);

在特定修订版中查找实体状态

此命令还返回给定修订版中实体的状态,即使该实体的最后更改是在给定修订版之前进行的。

$articleAudit = $auditReader->find(
    SimpleThings\EntityAudit\Tests\ArticleAudit::class,
    $id = 1,
    $rev = 10
);

通过 AuditReader#find() 创建的实例 不会 注入到 EntityManagers UnitOfWork 中,如果应该将其重新附加到旧版本的持久性上下文,则必须将其合并到 EntityManager 中。

查找审计实体的修订历史记录

$revisions = $auditReader->findRevisions(
    SimpleThings\EntityAudit\Tests\ArticleAudit::class,
    $id = 1
);

修订具有以下 API

class Revision
{
    public function getRev();
    public function getTimestamp();
    public function getUsername();
}

在特定修订版中查找更改的实体

$changedEntities = $auditReader->findEntitiesChangedAtRevision(10);

更改实体具有以下 API

class ChangedEntity
{
    public function getClassName();
    public function getId();
    public function getRevisionType();
    public function getEntity();
}

查找审计实体的当前修订版

$revision = $auditReader->getCurrentRevision(
    'SimpleThings\EntityAudit\Tests\ArticleAudit',
    $id = 3
);

设置当前用户名

每次修订都会自动保存更改用户名的记录。为了使此功能正常工作,用户名必须可解析。

在Symfony Web环境中,用户名从当前安全上下文令牌中解析。

您可以通过配置包中的 username_callable 服务来覆盖此行为。您的自定义服务必须是一个 callable,并应返回一个 stringnull

# config/packages/entity_audit.yaml

simple_things_entity_audit:
    service:
        username_callable: acme.username_callable

在独立应用或Symfony命令中,您可以使用 AuditConfiguration 将用户名可调用设置为一个特定值。

$auditConfig = new \SimpleThings\EntityAudit\AuditConfiguration();
$auditConfig->setUsernameCallable(function () {
	$username = //your customer logic
    return username;
});

查看审计记录

提供了一个默认的Symfony控制器,它提供了对审计数据的查看基本功能。

要使用此控制器,导入路由(不要忘记保护您设置的任何前缀,以确保只有适当的用户可以访问)

# config/routes.yaml

simple_things_entity_audit:
    resource: "@SimpleThingsEntityAuditBundle/Resources/config/routing/audit.xml"
    prefix: /audit

这为您提供了几个不同的路由

  • simple_things_entity_audit_home - 显示修订记录的分页列表、时间戳以及执行修订的用户
  • simple_things_entity_audit_viewrevision - 显示特定修订中修改的类
  • simple_things_entity_audit_viewentity - 显示指定实体被修改的修订记录
  • simple_things_entity_audit_viewentity_detail - 显示指定实体在指定修订的数据
  • simple_things_entity_audit_compare - 允许您比较两个修订之间实体的更改

待办事项

  • 目前仅适用于自增数据库
  • 需要正确的元数据映射,允许禁用字段和关联的版本控制。
  • 它不适用于联合表继承(单表继承应该可以工作,但未测试)
  • 多对多关联不进行版本控制