sebvie/php-object-history

记录PHP对象的更改并在csv文件中显示

v1.0.1 2019-11-14 13:57 UTC

This package is auto-updated.

Last update: 2024-09-15 00:25:33 UTC


README

Build Status Coverage Status codecov

php-object-history

该包记录PHP对象的更改并将其持久化到存储中。如果你有一系列数据,只想获取更改集以减少内存使用,这非常有用。

安装

composer require sebvie/php-object-history

示例

初始化存储和比较器

use PhpObjectHistory\Comparer\ObjectComparer;
use PhpObjectHistory\Storage\CsvFileStorage;
use PhpObjectHistory\ObjectHistory;

$storage = new CsvFileStorage();
$storage->setCsvFilePath($filePath);

$objectComparer = new ObjectComparer();

$objectHistory = new ObjectHistory(
    $storage,
    $objectComparer
);

添加对象


$object = new \stdClass();
$object->testProperty = 1;
$object->testPropertyUnchanged = true;

$objectHistory->addObject($object);

$object = new \stdClass();
$object->testProperty = 2;
$object->testPropertyUnchanged = true;

$objectHistory->addObject($object);

结果是包含以下内容的csv文件

testProperty,testPropertyUnchanged
1;true
2

自定义格式化程序

你可以添加自定义格式化程序以简化对象

use PhpObjectHistory\Formatter\ObjectFormatterInterface

class ToStringFormatter implements ObjectFormatterInterface
{

    /**
     * @param object $object
     * @return string
     */
    public function format(object $object): string
    {
        return $object->__toString();
    }

    /**
     * @param object $object
     * @return bool
     */
    public function supports(object $object): bool
    {
        return method_exists($object, '__toString');
    }
}

添加格式化程序

$formatter = new CustomFormatter();

$storage = new CsvFileStorage();
$storage->setCsvFilePath($filePath);
$storage->getObjectFormatterHandler()->addFormatter($formatter);

$objectComparer = new ObjectComparer();
$objectComparer->getObjectFormatterHandler()->addFormatter($formatter);

实现自定义存储

use PhpObjectHistory\Entity\ObjectChange;

class InMemoryStorage implements StorageInterface
{
    
    /**
     * @var array
     */
    protected $result = [];
    
    /**
     * @param object $object
     */
    public function setInitialObject(object $object): void
    {
        $this->result[] = $object;
    }

    /**
     * @param ObjectChange[] $objectChanges
     */
    public function addObjectChanges(array $objectChanges): void
    {
        if (empty($objectChanges)) {
            return;
        }

        $this->result[] = $objectChanges;
    }

    /**
     * @return array
     */
    public function getResult(): array
    {
        return $this->result;
    }

}

可用存储

  • CsvFileStorage
  • InMemoryStorage

可用格式化程序

  • DatetimeFormatter
  • ToStringFormatter

忽略对象属性

你可以忽略某些属性的更改。这不会触发对象更改。

当你有像时间戳这样的属性始终变化但可以忽略时,这很有用。

$ignoreAttributes = ['boolProperty'];
$objectComparer = new ObjectComparer();
$objectComparer->setIgnoreAttributes($ignoreAttributes);