nimbly / announce
PSR-14 事件分发器,支持订阅者。
2.0.1
2023-08-06 13:23 UTC
Requires
- php: ^8.0
- nimbly/resolve: ^2.0
- psr/event-dispatcher: ^1.0
Requires (Dev)
- nimbly/carton: ^1.2
- php-coveralls/php-coveralls: ^2.1
- phpunit/phpunit: ^9.5
- symfony/var-dumper: ^6.0
- vimeo/psalm: ^4
Provides
README
一个简单的、框架无关的PSR-14事件分发器,适用于你的事件驱动应用程序。
特性
- 使用PHP的
#Attribute
功能将类方法注册为事件处理器 - 可选的PSR-11容器支持
- 完全支持自动装配您的订阅者和监听者 - 不仅传入事件,还可以传入任何所需的服务或其他依赖项!
安装
composer require nimbly/announce
快速开始
创建事件类
您的事件可以是独立类,也可以扩展StoppableEvent
抽象类。通过扩展StoppableEvent
抽象类,您可以在需要时停止事件传播。
namespace App\Events; use App\Models\User; use Nimbly\Announce\Event; class UserRegisteredEvent extends StoppableEvent { public function __construct(public User $user) { } }
创建订阅者
订阅者是处理您事件的类。您可以根据需要拥有任意数量的订阅者。
要注册订阅者的方法以处理特定事件或一组事件,请使用Nimbly\Announce\Subscribe
属性,并传入要监听的事件名称的逗号分隔列表。
namespace App\Subscribers; use App\Events\UserRegisteredEvent; use App\Services\EmailService; use Nimbly\Announce\Subscribe; class EmailSubscriber { #[Subscribe(UserRegisteredEvent::class)] public function onUserRegistered( UserRegisteredEvent $event, EmailService $emailService): void { $emailService->send("registration_email", $event->user->email); } }
初始化分发器
要将您的订阅者注册到事件分发器中,请将类名或实例的数组传递给Dispatcher
构造函数。
您还可以传递一个PSR-11兼容的容器实例,用于自动装配您的订阅者以及用于订阅者上的事件处理器。
$dispatcher = new Dispatcher( subscribers: [ EmailSubscriber::class, new FooSubscriber, ], container: $container );
分发事件
要触发事件,只需调用具有事件实例的dispatch
方法。
$event = new UserRegisteredEvent($user); $dispatcher->dispatch($event);
停止事件传播
如果您需要在事件的生命周期中停止事件传播,只需在事件实例上调用stop()
方法。事件将不再传播到任何其他已订阅的监听者。这要求事件扩展自StoppableEvent
抽象。
class EmailSubscriber { #[Subscribe(UserRegisteredEvent::class)] public function onUserRegistered( UserRegisteredEvent $event, EmailService $emailService): void { $emailService->send("registration_email", $event->user->email); // Prevent any further handlers from processing this event $event->stop(); } }
注册单个监听器
或者,您可以使用listen
方法注册单个事件。
$dispatcher = new Dispatcher; $dispatcher->listen( UserRegisteredEvent::class, function(UserRegisteredEvent $event): void { // do some event stuff } );
通配符监听器
您可以通过使用*
事件名称来注册一个“通配符”监听器。这将订阅所有触发的事件。
$dispatcher = new Dispatcher; $dispatcher->listen( "*", function($event): void { // Respond to all events... } );