thefreshuk/pubsub-laravel

为 Laravel 应用提供 Pub/Sub 支持

v3.1.1 2023-05-10 14:42 UTC

README

此包通过基于内容的 Pub/Sub 模型将 Laravel 项目与发布/订阅提供者集成。

支持的提供者

  • AWS SNS

安装

通过 composer

$ composer require thefreshuk/pubsub-laravel

配置

默认情况下,此包会查找以下环境变量

PUBSUB_PROVIDER=sns
PUBSUB_TOPIC=<insert topic name>
PUBSUB_ALLOW_HTTP=<true or false>
PUBSUB_SNS_HOST_PATTERN=<regex string e.g /yourdomain.com/>

您可以通过在项目中运行以下命令来覆盖此设置

php artisan vendor:publish

关于 PUBSUB_ALLOW_HTTP,此配置将库配置为允许 HTTP 端点。目前,只有签名证书 URL 作为 SNS 消息验证的一部分进行检查。将此设置为 true 需要使用分叉包(AWS SNS 消息验证器默认情况下根本不允许 HTTP)。要设置此配置,请将以下内容添加到您的 composer.json 文件中

"repositories": [
  {
    "type": "vcs",
    "url": "git@github.com:thefreshuk/aws-php-sns-message-validator.git"
  }
]

然后运行

$ composer update

用法

订阅

有两种方式可以订阅一个主题

1. 扩展 SubscriptionServiceProvider

use TheFresh\PubSub\SubscriptionServiceProvider as ServiceProvider;

class MockSubscriptionServiceProvider extends ServiceProvider
{
    public static $booted = false;

    /**
     * Like RouteServiceProvider, this namespace is applied to
     * the routes generated by this service provider.
     *
     * @var string $namespace
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * A mapping of message types to routes/controller actions that capture
     * messages.
     *
     * @var string $subscribe
     */
    protected $subscribe = [
        'test_type1' => ['/subscriptions/test-type', 'MockController@onTestType']
    ];

    public function boot()
    {
        parent::boot();

        static::$booted = true;
    }
}

这允许您指定 '类型' 到路由和控制器之间的映射。

类型是我们区分消息的方式。结合基于内容的筛选,这提供了一种感觉像多主题系统而没有在传统 SNS 中主题泛滥的系统。

2. 注入主题

Topic 类可以按照您希望的方式使用。通过提供 ClientInterface 对象和主题名称(字符串),您可以使用此库使用多个主题。

Laravel 将将默认的 Topic 注入到相关类型提示的构造函数中。由于库是为与基于内容的 Pub/Sub 系统一起使用而设计的,因此必须有一个 '默认' 主题,否则这将失败。

发布

Topic 类提供了一个接受消息的发布方法。对于给定的主题调用此方法就很简单。

$topic->publish($message);

消息

消息由发布者发送并由订阅者接收。每条消息都有一个 '类型' 和 '内容'

{
  type: string,
  content: {}
}

Pub/Sub 系统最好基于类型属性进行筛选。

使用 Messages 有两种方式

1. 分离的类

您可以使用以下命令生成消息类

$ artisan make:message ExampleMessage

这将在 <app_dir>/PubSub/Messages 中生成一个消息类。您可以实例化和发布这些消息。

2. DynamicMessage

您还可以使用 TheFresh\PubSub\Messages\DynamicMessage 类。它接受 $type$content 构造函数参数。所有通过订阅接收到的消息都是 DynamicMessage