jsonbaby/event-bridge

dev-main 2022-07-09 03:20 UTC

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']);