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... } );