phpgears/event

事件处理

0.3.4 2020-04-19 12:16 UTC

This package is auto-updated.

Last update: 2024-08-25 07:34:13 UTC


README

PHP version Latest Version License

Build Status Style Check Code Quality Code Coverage

Total Downloads Monthly Downloads

事件

事件基础类和处理接口

本包只提供事件构建块

安装

Composer

composer require phpgears/event

用法

需要 composer 自动加载文件

require './vendor/autoload.php';

事件

事件是 DTO,包含已经发生的情况的所有信息

您可以通过实现 Gears\Event\Event 或从 Gears\Event\AbstractEvent 扩展来创建自己的事件,这确保了事件不可变性和负载以及元数据仅由 标量值 组成,这是一个非常有趣的功能。AbstractEvent 有一个私有构造函数,迫使您使用命名的构造函数上的 occurred 静态方法来创建事件

use Gears\Event\AbstractEvent;

class CreateUserEvent extends AbstractEvent
{
    public static function fromPersonalData(
        string $name,
        string lastname,
        \DateTimeImmutable $birthDate
    ): self {
        return static::occurred([
            'name' => $name,
            'lastname' => $lastname,
            'birthDate' => $birthDate->format('U'),
        ]);
    }
}

如果没有负载的事件,您可以从 Gears\Event\AbstractEmptyEvent 扩展

use Gears\Event\AbstractEvent;

class CreateUserEvent extends AbstractEmptyEvent
{
    public static function instance(): self {
        return self::occurred();
    }
}

集合

事件可以组合成实现 Gears\Event\EventCollection 对象的可迭代对象,提供了 Gears\Event\EventArrayCollectionGears\Event\EventIteratorCollection,仅接受 Gears\Event\Event 的实例

异步事件

当您想要将事件处理委托给消息队列系统(如 RabbitMQ、Gearman 或 Apache Kafka)时,证明所有负载都是标量值非常有用,因为任何格式和语言中序列化和反序列化标量值都是微不足道的

异步行为必须在 EventBus 级别实现,EventBus 必须能够通过负载参数识别异步事件(事件映射,实现接口,通过负载参数,...)并将它们入队

如果您想在您的 EventBus 上实现异步行为,请查看 phpgears/event-async,在那里您将找到启动异步事件总线所需的所有必要组件

处理器

事件被传递给 Gears\Event\EventHandler 的实现,本包中提供了 AbstractEventHandler,它验证事件的类型,因此您可以只关注实现处理逻辑

class CreateUserEventHandler extends AbstractEventHandler
{
    protected function getSupportedEventType(): string
    {
        return CreateUserEvent::class;
    }

    protected function handleEvent(Event $event): void
    {
        /* @var CreateUserEvent $event */

        $user = new User(
            $event->getName(),
            $event->getLastname(),
            $event->getBirthDate()
        );

        [...]
    }
}

请查看 phpgears/dto 以更好地理解事件是如何从 DTO 中构建的以及它们如何保留其负载

事件总线

仅提供 Gears\Event\EventBus 接口,您可以通过简单地添加一个适配器层来轻松使用任何可用的良好总线库

实现

当前可用的事件总线实现

贡献

发现错误或有功能请求? 请创建一个新问题。在提交之前查看现有问题。

请参阅文件 CONTRIBUTING.md

许可

有关许可条款的副本,请参阅源代码中包含的文件 LICENSE