noop/flushlog

该软件包最新版本(dev-master)没有可用的许可证信息。

dev-master 2019-11-14 12:06 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?

正在开发一个包。

好的,我该如何安装它?

  1. 初始化 FlushLogSubscriber
$subscriber = new Noop\FlushlLog\Doctrine\ORM\FlushLogSubscriber();
  1. 设置配置(见下例)
$subscriber->setConfiguration(...);
  1. 将订阅者添加到 Doctrine 的 EventManager
$eventManager->addEventSubscriber($subscriber);
  1. 扩展 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']
        ],
    ]
]