noop / flushlog
Requires
- php: ^7.1.3
- doctrine/orm: ^2.5
Requires (Dev)
- phpunit/phpunit: ^8.3
- symfony/security: ^3.4|^4.0
This package is auto-updated.
Last update: 2024-09-30 02:10:36 UTC
README
这是 Doctrine2 的附加组件,实现了 EntityManager::flush() 记录和历史功能。它可以替代 EntityAudit 和 Atlantic18 Loggable / Blameable 扩展。
为什么?
因为关系。大多数库只记录单个实体的更改,但 ProductTranslation 的更改实际上是从应用程序角度对 Product 的更改。集合更新也很重要(谁将图片附加到这个产品上?)。
因此,这个库记录 flushes,包含许多更改(插入、删除、删除,以及集合更改)。它还试图成为一个低级别库,不在每个 flush 中创建新实体,直接操作 DBAL。
如何?
基本上,这个库将 UnitOfWork 序列化为 JSON,并依赖于数据库本机函数来浏览和搜索日志。这似乎是记录关系更改(谁给订单 #216 添加了标签 "Cancelled")的唯一方式,并提供了一定的灵活性。
它是稳定的吗?支持什么?
稳定性:处于开发中。请加入我们!
数据库支持:MySQL 5.6+
ORM: 2.5+
PHP: 7.1+
功能
- 过滤实体
- 过滤实体字段(只有当实体中的一个字段被更新时,实体才会被跟踪)
- 集合更改跟踪
- "受影响实体" 概念。
ProductTranslation的更改会影响Product的更改,即使Product实体根本未更改。
常见问题解答
JSON 搜索非常慢。你能添加索引吗?
不能,这是一个不好的方法。如果你的应用程序依赖于实体更改并频繁查询 flushlog,一个可行的方案是使用可以处理 JSON 的外部搜索系统,如 Elasticsearch、Sphinxsearch 或 Lucene。
你能支持对象的版本吗?
可以,但我需要一些时间(为每个实体创建一个版本,并将其链接到特定的 flushlog),你可以提交一个 pull request 或者,作为替代,赞助开发。
和 Symfony?
正在开发一个包。
好的,我该如何安装它?
- 初始化
FlushLogSubscriber
$subscriber = new Noop\FlushlLog\Doctrine\ORM\FlushLogSubscriber();
- 设置配置(见下例)
$subscriber->setConfiguration(...);
- 将订阅者添加到 Doctrine 的
EventManager
$eventManager->addEventSubscriber($subscriber);
- 扩展
Noop\FlushLog\Doctrine\Entity\BaseLogEntry以更新您的模式(它是一个MappedSuperclass,因此您的实体应该非常空)
<?php namespace App\Tests\Entity; use Noop\FlushLog\Doctrine\Entity\BaseLogEntry; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity() */ class LogEntry extends BaseLogEntry { }
JSON 字段的内部结构
示例 JSON
{
"e": {
"App\\Entity\\EntityName": [6, 18, "123;31"]
},
"i": {
"App\\Entity\\EntityName": [6, 18, "123;31"]
},
"cs": {
"App\\Entity\\EntityName": {
"6": {
"field": [null, "asdf"],
"field1": [null, 6]
}
}
}
}
"e"包含所有受影响实体的类 -> id 映射(无论是直接还是间接,通过配置或通过集合更改)"i"包含所有插入实体的类 -> id 映射"cs"包含所有更改集的类 -> id -> 字段映射。您可以在配置中为每个实体设置跟踪的字段。默认情况下,如果实体被跟踪,则所有字段都会被跟踪
配置
示例配置(在 FlushLogSubscriber::setConfiguration 中设置)
[
// lists tracked entities. All other entities are ignored
'entities' => [
'App\Entity\EntityName' => [
],
'App\Entity\OtherEntityName' => [
// if "fields" is set, only these fields will be tracked, otherwise, all fields are tracked
'fields' => ['id', 'name']
],
]
]