jtreminio / entity-audit-bundle
Doctrine 实体审计
Requires
- php: ^5.3.9|~7.0
- doctrine/dbal: ~2.5
- doctrine/orm: ~2.5
Requires (Dev)
- doctrine/doctrine-bundle: ~1.4
- gedmo/doctrine-extensions: ^2.3.1
- phpunit/phpunit: ~4.8.20
- symfony/framework-bundle: ~2.7|~3.0
- symfony/var-dumper: ^2.7
Conflicts
- doctrine/doctrine-bundle: <1.4
- gedmo/doctrine-extensions: <2.3.1
- symfony/framework-bundle: <2.7
README
此 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
实例进行审计信息查询。
在 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(); }
在特定修订版本中查找已更改的实体
$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 的 Web 上下文中,用户名自动设置为当前安全令牌中的用户名。
在独立应用程序或 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 -- 允许您比较两个修订版本之间实体的更改
待办事项
- 目前仅适用于自增数据库
- 需要适当的元数据映射,允许禁用字段和关联的版本控制。
- 它不支持联合表继承(单表继承应该可以工作,但尚未测试)
- 多对多关联不会被版本化