
Composer在线学习地址:学习地址
经过一番调研,我们找到了一个完美的解决方案:sonata-project/entity-audit-bundle。这个强大的 Doctrine 扩展包,灵感来源于 Hibernate Envers,能够为你的 Doctrine 实体及其关联关系提供完整的版本控制和审计功能。它的核心思想是,每当一个被审计的实体发生插入、更新或删除操作时,都会自动记录下当前实体的完整状态,并关联一个全局的修订版本号。
这个 Bundle 的巧妙之处在于它的实现方式:
_audit 表):对于每一个你选择进行审计的实体,它都会在数据库中创建一个对应的“镜像”表,命名规则通常是 [原始表名]_audit。这个审计表会包含原始实体表的所有字段,并额外增加两个关键字段:rev:一个全局的修订版本号,来源于一个独立的 revisions 表。revtype:表示本次变更的类型,可以是 'INS' (插入), 'UPD' (更新) 或 'DEL' (删除)。revisions 表):这个表记录了每一次修订的元数据,包括一个唯一的 id (即 rev 字段的值), timestamp (变更发生的时间), username (执行变更的用户) 和 comment (可选的变更备注)。通过这种机制,我们不仅可以知道实体在某个时间点的完整状态,还能追溯到是谁、在什么时候、做了什么类型的修改。
集成 sonata-project/entity-audit-bundle 到你的 Symfony 项目中非常简单,Composer 再次发挥了其包管理器的强大作用。
首先,使用 Composer 安装该 Bundle:
<code class="bash">composer require sonata-project/entity-audit-bundle</code>
在 config/bundles.php 文件中启用该 Bundle:
<pre class="brush:php;toolbar:false;">// config/bundles.php
return [
// ...
SimpleThings\EntityAudit\SimpleThingsEntityAuditBundle::class => ['all' => true],
// ...
];在 config/packages/entity_audit.yaml 文件中,指定你需要审计的实体类:
<pre class="brush:php;toolbar:false;"># config/packages/entity_audit.yaml
simple_things_entity_audit:
audited_entities:
- App\Entity\Product # 替换为你的实体类
- App\Entity\Order # 替换为你的实体类
# 可选:全局忽略某些字段,例如创建时间、更新时间,避免不必要的修订记录
global_ignore_columns:
- created_at
- updated_at
# 可选:如果你使用非默认的 Doctrine 连接或实体管理器
# connection: custom_connection_name
# entity_manager: custom_entity_manager_name运行 Doctrine 命令来生成并执行新的数据库 Schema 变更,这将创建所有必要的 _audit 表和 revisions 表:
<pre class="brush:php;toolbar:false;">php bin/console doctrine:schema:update --force # 或者先查看SQL再执行 # php bin/console doctrine:schema:update --dump-sql
至此,你的实体审计功能就已配置完毕!
配置完成后,当你的 Product 或 Order 实体发生任何修改时,_audit 表都会自动记录下这些变更。那么,我们如何查询这些历史数据呢?
AuditReader 查询你可以通过 AuditReader 服务来获取审计信息:
<pre class="brush:php;toolbar:false;"><?php
namespace App\Controller;
use SimpleThings\EntityAudit\AuditReader;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Product; // 假设这是你要审计的实体
class AuditController extends AbstractController
{
/**
* @Route("/product/{id}/history", name="product_history")
*/
public function showProductHistory(int $id, AuditReader $auditReader): Response
{
// 获取某个产品的所有修订历史
$revisions = $auditReader->findRevisions(Product::class, $id);
$history = [];
foreach ($revisions as $revision) {
// 获取该产品在特定修订版本时的状态
$productAtRevision = $auditReader->find(Product::class, $id, $revision->getRev());
$history[] = [
'revision_id' => $revision->getRev(),
'timestamp' => $revision->getTimestamp()->format('Y-m-d H:i:s'),
'username' => $revision->getUsername() ?: '未知',
'revtype' => $productAtRevision->getRevType(), // Bundle会在审计实体中添加这个方法
'price' => $productAtRevision->getPrice(),
'name' => $productAtRevision->getName(),
// ... 其他你关心的字段
];
}
return $this->render('audit/product_history.html.twig', [
'product_id' => $id,
'history' => $history,
]);
}
}sonata-project/entity-audit-bundle 还提供了一个开箱即用的 Web 界面,让你无需编写任何前端代码即可查看审计数据。你只需要在 config/routes.yaml 中导入它的路由:
<pre class="brush:php;toolbar:false;"># config/routes.yaml
simple_things_entity_audit:
resource: "@SimpleThingsEntityAuditBundle/Resources/config/routing/audit.xml"
prefix: /audit # 审计界面的访问前缀,记得要对其进行安全保护!导入后,访问 /audit 路径,你就能看到一个功能完善的审计管理界面,包括:
这个界面极大地提升了审计数据的可读性和管理效率。
通过 sonata-project/entity-audit-bundle,我们彻底解决了数据变更追溯的难题,带来了以下显著优势:
借助 Composer 的便捷安装,以及 sonata-project/entity-audit-bundle 的强大功能,我们的项目在数据管理和问题排查方面都取得了质的飞跃。如果你也正被实体数据变更的迷雾所困扰,不妨尝试一下这个优秀的 Bundle,它一定会成为你项目中的得力助手!
以上就是告别数据变更迷雾:使用Composer与SonataEntityAuditBundle轻松追踪Doctrine实体历史的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号