rmzamora/entity-audit-bundle

简单事物的分支,用于 Doctrine 实体的审计

v0.2 2012-07-07 09:00 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:05:57 UTC


README

Build Status

这个 Doctrine 2 扩展程序受到 Hibernate Envers 的启发,允许对实体及其关联进行完全版本控制。

它是如何工作的?

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

  • rev - 包含由 "revisions" 表生成的全局修订号。
  • revtype - 包含 'INS'、'UPD' 或 'DEL' 之一,作为导致此修订日志条目类型的数据库操作的标识。

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

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

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

安装(在 Symfony2 应用程序中)

###安装包

简单地运行,假设您已安装 composer.phar 或 composer 二进制文件

$ php composer.phar require simplethings/entity-audit-bundle

###启用包

最后,在内核中启用包

// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        //...
        new SimpleThings\EntityAudit\SimpleThingsEntityAuditBundle(),
        //...
    );
    return $bundles;
}

###配置

加载扩展 "simple_things_entity_audit" 并指定要审计的实体(现在看起来很丑!)

#####app/config/config.yml

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

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

#####app/config/config.yml

    simple_things_entity_audit:
        global_ignore_columns:
            - created_at
            - updated_at

###创建新表

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

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

注意:EntityAudit 目前 与名为 "default" 的 DBAL 连接和 EntityManager 一起工作。

安装(独立使用)

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

use Doctrine\ORM\EntityManager;
use Doctrine\Common\EventManager;
use SimpleThings\EntityAudit\AuditConfiguration;
use SimpleThings\EntityAudit\AuditManager;

$auditconfig = new AuditConfiguration();
$auditconfig->setAuditedEntityClasses(array(
    'SimpleThings\EntityAudit\Tests\ArticleAudit',
    'SimpleThings\EntityAudit\Tests\UserAudit'
));

$auditconfig->setGlobalIgnoreColumns(array(
    'created_at',
    'updated_at'
));

$evm = new EventManager();
$auditManager = new AuditManager($auditconfig);
$auditManager->registerEvents($evm);

$config = new \Doctrine\ORM\Configuration();
// $config ...
$conn = array();
$em = EntityManager::create($conn, $config, $evm);

用法

使用 SimpleThings\EntityAudit\AuditReader 实例查询审计信息。

In Symfony2,AuditReader 已注册为服务 "simplethings_entityaudit.reader"

class DefaultController extends Controller
{
    public function indexAction()
    {
        $auditReader = $this->container->get("simplethings_entityaudit.reader");
    }
}

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

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

查找特定修订的实体状态

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

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

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

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

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

修订有以下的 API

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

查找审计实体的当前修订

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

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

    $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
    );

设置当前用户名

每个修订都会自动保存更改它的用户名。为此,您必须设置用户名。在 Symfony2 网络上下文中,用户名会自动设置为当前安全令牌中的用户名。

在独立应用程序或 Symfony 命令中,您必须使用 AuditConfiguration 将用户名设置为特定值。

    // Symfony2 Context
    $container->get('simplethings_entityaudit.config')->setCurrentUsername( "beberlei" );

    // Standalone App
    $auditConfig = new \SimpleThings\EntityAudit\AuditConfiguration();
    $auditConfig->setCurrentUsername( "beberlei" );

查看审计

提供了一个默认的Symfony2控制器,该控制器提供了查看已审计数据的基本功能。

要使用此控制器,请导入路由(别忘了保护您设置的别名,以确保只有适当的用户才能访问)

#####app/config/routing.yml

simple_things_entity_audit:
    resource: "@SimpleThingsEntityAuditBundle/Resources/config/routing.yml"
    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 -- 允许您比较两个修订之间实体的更改

待办事项

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