nimbly/announce

PSR-14事件派发器,支持订阅者。

2.0.1 2023-08-06 13:23 UTC

This package is auto-updated.

Last update: 2024-09-06 15:58:33 UTC


README

Latest Stable Version GitHub Workflow Status Codecov branch License

一个简单、不依赖框架的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...
	}
);