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