generationtux/radioland

dev-master 2022-05-11 20:23 UTC

README

Build Test Status

@todo 记录订阅处理。

支持SNS和自定义后端提供者的Pubsub实用工具。

快速开始

使用Composer安装

$ composer require generationtux/radioland

使用后端提供者和发布消息初始化客户端(配置示例请见SNS

<?php

use Gentux\Radioland\Radio;
use Gentux\Radioland\Message;
use Gentux\Radioland\Providers\SNSProvider;

$radio = new Radio(new SNSProvider(["region" => "us-east-1"]));

$message = new Message("arn::some-topic", ["some" => "data"]);
$radio->publish($message);

发布多条消息

$messages = [
        new Message("channel-1", ["some" => "data"]),
        new Message("channel-2", ["some" => "data"]),
];

$radio->publishAll($messages);

收集消息并稍后发布。

$radio->collect(new Message(...));
// ...
$radio->collect(new Message(...));
// ...
$radio->publishCollection();

提供者

提供者是处理pubsub消息的基础应用或服务。目前仅支持SNS,但您也可以添加自定义提供者

SNS

SNS提供者将默认从环境中读取值。以下可以用于通过环境配置客户端

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_REGION

您也可以直接将配置选项传递给提供者

new SNSProvider([
        "region" => "us-east-1",
]);

有关可用配置选项的信息,请参阅AWS客户端配置

为了发布消息,您需要指定要发布的主题ARN。这将作为消息的channel参数,消息的数据将进行JSON编码。例如

$message = new Gentux\Radioland\Message('arn::some-topic', ['will-be' => 'json-encoded']);

// will result in a call to SNS with data that looks like
[
    'TopicArn': 'arn::some-topic',
    'Message': '{"will-be":"json-encoded"}',
]

Laravel

Radioland提供了一种中间件,可用于与Laravel或Lumen一起使用,在请求/响应生命周期之后发布收集到的消息。这允许应用在其正常的HTTP过程中收集消息,然后在响应发送后,将这些消息发布到提供者而无需让客户端等待。

首先,在App\Providers\AppServiceProvider中的register方法中配置Radioland实例,作为单例。

<?php

use Gentux\Radioland\Radio;
use Gentux\Radioland\Providers\SNSProvider;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(Radio::class, function ($app) {
            return new Radio(new SNSProvider([...]));
        });
    }
}

接下来,将中间件添加到App\Http\Kernel

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
        protected $middleware = [
                \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
                \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
                \App\Http\Middleware\TrimStrings::class,
                \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
                \App\Http\Middleware\TrustProxies::class,

                \Gentux\Radioland\Laravel\PublishCollectionAfterResponse::class, // <<------ Add middleware class
        ];
}

现在,消息可以在请求期间收集,在响应发送后,它们将被发布到提供者。例如,在一个控制器中

<?php

namespace App\Http\Controllers;

use Gentux\Radioland\Radio;
use Gentux\Radioland\Message;

class SomeController extends Controller
{
        public function store(Radio $radio)
        {
                $radio->collect(
                        new Message("some-channel", [
                                "action" => "storing new data",
                        ])
                );

                // ...
        }
}

自定义提供者

自定义提供者应实现Gentux\Radioland\Providers\ProviderInterface。配置可以作为一个数组传递给提供者的构造函数。