ufo-tech/event-sourcing 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

ufo-tech/event-sourcing

Composer 安装命令:

composer require ufo-tech/event-sourcing

包简介

A lightweight event sourcing library with aggregates, event store and projections for modern PHP applications.

README 文档

README

A lightweight and modern Event Sourcing library for PHP 8.3+

🚀 Features

  • Stores domain events instead of the current state
  • Rebuilds aggregate state through event replay
  • Supports projections for building read models
  • Provides interfaces for custom event stores and dispatchers

📖 Core Concepts

  • Resolver — module for generating differences between old and new state.
  • Restorer — module for rebuilding an object from changes.
  • Merger — service for step-by-step application of changes to an object.
  • ContextDTO — DTO for passing context during change analysis (path, collection type, attributes).
  • Attributes — PHP 8.3 attributes for controlling change detection behavior.

🛠 Installation

composer require ufo-tech/event-sourcing

📦 Components

Resolver

Class Description
MainResolver Delegates change detection to appropriate resolver
ObjectResolver Handles objects via Reflection API
CollectionResolver Supports associative arrays
ArrayResolver Handles indexed arrays
ScalarResolver Compares scalar values

Restorer & Merger

Class Description
Merger Merges changes into the base state
ObjectRestorer Rebuilds an object from a collection of changes via DTOTransformer
ObjectDefinition Defines the object type to restore from change history

Interfaces

Interface Purpose
ResolverInterface Detects changes between states
MergerInterface Merges changes into a state
RestorerInterface Restores an object from change history
MainResolverInterface Encapsulates multiple resolvers
MainResolverFactoryInterface Factory for creating the main resolver

🟠 Attributes

Attribute Purpose
#[ChangeIgnore] Ignores a field during change detection
#[AsCollection] Marks a field as a key-based collection

🟢 Contexts

ContextDTO allows passing additional metadata during resolving:

  • Current path (path)
  • Type (collection/array/scalar)
  • Special delete placeholder (__DELETED__)
  • Supports nested paths for objects and collections

ContextDTO Rules

  • ContextDTO::create() creates a base context with root path root.
  • forPath(string $param) adds a path segment (e.g., root.products).
  • makeAssocByPath(string $path) marks a path as associative (e.g., products, root.products.*).
  • Supports pattern paths with $ that converts to * for nested collections.
  • Delete placeholder can be customized via ContextDTO::create(deletePlaceholder: '__DELETED__').

Examples:

use Ufo\EventSourcing\Resolver\ContextDTO;

// Single path
$context = new ContextDTO(assocPaths: ['products']);
$context = new ContextDTO(assocPaths: 'products');

// Multiple paths
$context = new ContextDTO(assocPaths: ['products', 'items.subitems']);

// Custom delete placeholder
$context = new ContextDTO(deletePlaceholder: '__DELETED__', assocPaths: ['products']);

Using patterns:

// All subitems inside any items are treated as collections
$context = ContextDTO::create()
    ->makeAssocByPath('items.$.subitems');

// products.*.discounts.*.details are treated as associative
$context = ContextDTO::create()
    ->makeAssocByPath('products.$.discounts.$.details');

// Root-level collection
$context = ContextDTO::create(assocPaths: ['']);

📝 Note: $ automatically converts to * for wildcard path matching.

📝 Usage Examples

Detecting Changes

$mainResolver = (new DefaultResolverFactory())->create();
$diff = $mainResolver->resolve($oldObject, $newObject);

Using context for associative collection

$context = ContextDTO::create()->makeAssocByPath('products');
$diff = $mainResolver->resolve($old, $new, $context);

Restoring an object from change history

$restorer = new ObjectRestorer(new Merger());
$restored = $restorer->restore(
    (new ObjectDefinition(MyDto::class))
        ->addChanges($firstChange)
        ->addChanges($secondChange)
);

📚 Use Cases

  • Event Sourcing and CQRS architectures
  • Domain-Driven Design (DDD) based projects
  • Service-oriented systems with event-based persistence

📖 Documentation

Full documentation available at docs.ufo-tech.space

📜 License

MIT © UFO Tech

ufo-tech/event-sourcing 适用场景与选型建议

ufo-tech/event-sourcing 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 675 次下载、GitHub Stars 达 0, 最近一次更新时间为 2025 年 06 月 05 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「php」 「ddd」 「cqrs」 「event sourcing」 「aggregates」 「event store」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 ufo-tech/event-sourcing 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 ufo-tech/event-sourcing 我们能提供哪些服务?
定制开发 / 二次开发

基于 ufo-tech/event-sourcing 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 675
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 3
  • 点击次数: 28
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-06-05