jsonbaby / event-bridge
Requires
- php: ^8.0.2
- illuminate/support: ^9.0
- jsonbaby/events-base: dev-main
- predis/predis: ^1.1.9|^2.0
- symfony/property-access: ^6.1
- symfony/serializer: ^6.1
Requires (Dev)
- orchestra/testbench: ^7.1
- phpunit/phpunit: ^9.5.8
- vimeo/psalm: 5.x-dev
This package is auto-updated.
Last update: 2024-09-09 07:42:32 UTC
README
此包提供了事件发布和订阅的基本接口。默认使用Redis。
安装
composer require jsonbaby/event-bridge
php artisan event-bridge:install
用法
为了使此功能正常工作,您应该有一个中央事件存储(包、仓库等),这样您就可以在您的应用程序之间使用它。(用于多个应用程序之间的通信)。
所有事件都应该实现来自EventBase包的JsonBaby\EventBase\Interfaces\EventInterface
接口。事件将由从config/event-bridge.php
中获取监听器的事件处理器处理。因此,您可以将您的监听器添加到配置中。这与添加laravel一个类似。
config/event-bridge.php
包含EventBridgeServiceProvider
所需的其它配置,如果您想基于此包中定义的契约构建自己的东西。
注意:如果您将此包用于多个应用程序,应确保事件和序列化程序等类的相同,以便进行正确的通信。例如:您不能在app1中使用XmlSerializer
进行序列化,在app2中使用JsonSerializer
进行反序列化。因此,如果您想基于此包构建自己的东西,可以将其分支,添加内容,并在您的应用程序中使用您的包而不是这个。如果您不打算用于多个应用程序,请随意在项目目录中创建自己的实现,无需分支。
示例单个应用程序
默认情况下,我们使用Redis来发布和订阅。因此,您需要在您的应用程序中设置Redis。
-
安装包
composer require jsonbaby/event-bridge
-
在您的应用程序的某个位置添加一个事件和监听器
namespace App\Events; use DateTimeImmutable; use JsonBaby\EventBase\Interfaces\EventInterface; final class AcmeEvent implements EventInterface { public function __construct( private DateTimeImmutable $at, private string $acmeProperty, ) { } public static function getType(): string { return 'acme-event'; } public function getAt(): DateTimeImmutable { return $this->at; } public function getAcmeProperty(): string { return $this->acmeProperty; } public function getData(): array { return [ 'at' => $this->getAt(), 'acme_property' => $this->getAcmeProperty() ]; } } -------- namespace App\Events; class AcmeEventListener { public function handle(AcmeEvent $event) // AcmeEvent should implement JsonBaby\EventBase\Interfaces\EventInterface { // deal with AcmeEvent $data = $event->getData(); ... } }
-
将事件监听器添加到
config/event-bridge.php
'listeners' => [ AcmeEvent::class => [ AcmeEventListener::class ] ]
-
发布您的事件
use App\Events\AcmeEvent; app()->make(EventPubSubInterface::class)->publish('acme-channel', new AcmeEvent(new DateTimeImmutable(), 'acme_property'));
-
创建artisan命令并在其中订阅一个通道,使用以下代码片段。
app()->make(EventPubSubInterface::class)->subscribe(['acme-channel']);
示例多应用程序
默认情况下,我们使用Redis来发布和订阅。因此,您需要在您的应用程序中设置Redis(应在所有应用程序之间共享)。
-
应用程序1
-
安装包
composer require jsonbaby/event-bridge
-
将您的中央事件包添加到项目,例如
composer require foo/bar-events
或作为git
包 -
发布您的事件
use Foo\Bar\AcmeEvent; app()->make(EventPubSubInterface::class)->publish('acme-channel', new AcmeEvent(new DateTimeImmutable(), 'acme_property'));
-
-
应用程序2
-
安装包
composer require jsonbaby/event-bridge
-
将您的中央事件包添加到项目,例如
composer require foo/bar-events
或作为git
包 -
在您的应用程序的某个位置创建一个事件监听器
namespace App\CrossAppEvents; use Foo\Bar\AcmeEvent; class AcmeEventListener { public function handle(AcmeEvent $event) // AcmeEvent should implement JsonBaby\EventBase\Interfaces\EventInterface { // deal with AcmeEvent $data = $event->getData(); ... } }
-
将事件监听器添加到
config/event-bridge.php
'listeners' => [ AcmeEvent::class => [ AcmeEventListener::class ] ]
-
创建artisan命令并在其中订阅一个通道,使用以下代码片段。
app()->make(EventPubSubInterface::class)->subscribe(['acme-channel']);
-