generationtux / radioland
PHP的Pubsub库
dev-master
2022-05-11 20:23 UTC
Requires
- aws/aws-php-sns-message-validator: ^1.4
- aws/aws-sdk-php: ~3.0
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^6.4
This package is not auto-updated.
Last update: 2024-09-15 05:18:21 UTC
README
@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
。配置可以作为一个数组传递给提供者的构造函数。