dsentker/watcher

允许使用易于使用的API跟踪 doctrine 实体的变化。

0.3.0 2023-10-06 12:57 UTC

This package is auto-updated.

Last update: 2024-09-06 14:50:37 UTC


README

GitHub release Packagist Maintenance

允许使用易于使用且高度可定制的API跟踪 doctrine 实体的变化。

文档

查看文档

快速示例

您可以使用这个库来跟踪 doctrine 实体的变化。使用注解来定义要监视的字段。它们决定了更改要保存的位置。

// User Entity class
/**
 * @Column(type="string")
 * @WatchedField // <-- Watcher now tracks changes related to this field
 */
protected string $emailAddress;
/**
 * @var $dbParams array
 * @var $config Configuration
 */
$em = EntityManager::create($dbParams, $config, Watcher::createEventManager(new DatabaseHandler()));
Watcher::registerAnnotations();


/** @var $user User */
$user = $em->getRepository(User::class)->find(1);
$user->setUsername("A new username");
$em->persist($user);
$em->flush();

/** @var EntityLogRepository $logRepo */
$logRepo = $em->getRepository(EntityLog::class);

/** @var EntityLog[] $changes */
$changes = $logRepo->getLogsFromEntity($user);

$lastChange = $changes[0];
echo vsprintf("Last updated at (%s): Changed %s from '%s' to '%s'", [
    $lastChange->getChangedAt()->format('Y-m-d'),
    $lastChange->getFieldLabel(),
    $lastChange->getOldValue(),
    $lastChange->getNewValue(),
]); // Last updated at 2017-09-07: Changed Email Address from 'foo@example.com' to 'foo42@example.com' 

Symfony4 services.yaml 集成(示例)

    watcher.db_handler:
        class:         App\Utils\AppWatcherHandler #your handler, e.g. Database Handler
        autowire:      true

    Watcher\EventListener\FlushListener:
        calls:
            -   method: pushUpdateHandler
                arguments:
                    - '@watcher.db_handler'
            -   method: setAnnotationReader
                arguments:
                    - '@annotations.reader'
        tags:
            - { name: doctrine.event_listener, event: onFlush }
    Watcher\EventListener\LoadListener:
        arguments:
            -  'App\Entity\EntityLog' # The entity which relates to EntityLogRepository
        tags:
            - { name: doctrine.event_listener, event: postLoad }

已知限制

  • 此包能够跟踪单个字段和关联(集合)的变化,但依赖于 Doctrine 的概念,该概念仅限于跟踪拥有侧的字段变化。这意味着,不支持逆向关联(如 @OneToMany)。@ManyToMany@ManyToOne 关联 支持的。
  • 还要考虑开销。如果您选择了 DatabaseHandler,每个跟踪的实体更改会导致一个单独的数据库请求。

测试

TBD(支持受到欢迎!)

致谢

提交错误和功能请求

错误和功能请求在 GitHub 上跟踪。

待办事项

  • 使用接口做所有事情
  • 易于 Symfony 集成
  • 编写测试
  • 优化性能(分组更改?)

外部库

此库依赖于 Doctrine(惊喜!)和子包。

版权和许可

《Watcher》根据 MIT 许可证(MIT)授权使用。有关更多信息,请参阅 LICENSE。