phpgears / event
事件处理
Requires
- php: ^7.1
- myclabs/deep-copy: ^1.8
- phpgears/dto: ~0.3.1
Requires (Dev)
- brainmaestro/composer-git-hooks: ^2.8
- friendsofphp/php-cs-fixer: ^2.16
- infection/infection: ^0.13|^0.15
- overtrue/phplint: ^1.2
- phpmd/phpmd: ^2.8
- phpstan/extension-installer: ^1.0.3
- phpstan/phpstan: ^0.12
- phpstan/phpstan-deprecation-rules: ^0.12
- phpstan/phpstan-strict-rules: ^0.12
- phpunit/phpunit: ^7.5|^8.0
- povils/phpmnd: ^2.1
- roave/security-advisories: dev-master
- sebastian/phpcpd: ^4.0
- squizlabs/php_codesniffer: ^3.5
- thecodingmachine/phpstan-strict-rules: ^0.12
README
事件
事件基础类和处理接口
本包只提供事件构建块
安装
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\EventArrayCollection
和 Gears\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
接口,您可以通过简单地添加一个适配器层来轻松使用任何可用的良好总线库
实现
当前可用的事件总线实现
- phpgears/event-symfony-messenger 使用 Symfony 的 Messenger
- phpgears/event-symfony-event-dispatcher 使用 Symfony 的 Event Dispatcher
贡献
发现错误或有功能请求? 请创建一个新问题。在提交之前查看现有问题。
请参阅文件 CONTRIBUTING.md
许可
有关许可条款的副本,请参阅源代码中包含的文件 LICENSE。