homedoctor-es / laravel-eventbridge-broadcaster
一个用于将事件发布到 EventBridge 的 Laravel 广播驱动程序。
Requires
- php: ^7.3|^8.0
- ext-json: *
- aws/aws-sdk-php: ^3.155
- illuminate/support: ^8.52|^9.0|^10.0|^11.0
README
发布平台
类似于 Pusher,此包提供了用于 Laravel 广播 的驱动程序,以便在 AWS EventBridge 上发布服务器端事件。
我们理解 Broadcasting 通常用于将您的 Laravel 服务器端 事件 通过 WebSocket 连接广播到您的客户端 JavaScript 应用程序。然而,我们认为这种利用广播的方式对于 Pub/Sub 架构是有意义的,在这种架构中,应用程序希望广播一个服务器端事件,以通知外部世界刚刚发生了什么。
在这种情况下,当使用 SNS 驱动程序时,“channels”可以理解为“topics”,当使用 EventBridge 驱动程序时,“event buses”可以理解为“event buses”。
订阅者
这部分尚未实现,但我们使用此包 Laravel EventBridge sqs consumer 在其他服务中消费这些事件。
为此,我们使用以下架构
- "n" 个发布者,在 EventBridge 中发布事件
- 每个事件都在一个 SNS 主题中发布。
- 每个主题都可以由一个或多个 SQS 队列消费。
- 每个队列对应一个应用程序。
安装
您可以通过 composer 在 Laravel 8+ 应用程序上安装此包
composer require homedoctor-es/laravel-eventbridge-broadcaste
然后,将 HomedoctorEs\EventBridgeBroadcaster\EventBridgeBroadcasterServiceProvider::class 添加到 config/app.php 文件中,以自动加载驱动程序。
发布/广播
配置
您需要在 config/broadcasting.php 配置文件中添加以下连接并配置您的 AWS 凭据
'connections' => [ 'eventbridge' => [ //The connection name will be used as default eventbus 'driver' => 'eventbridge', 'region' => env('AWS_DEFAULT_REGION'), 'key' => env('AWS_ACCESS_KEY_ID'), 'endpoint' => env('AWS_URL'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'source' => env('AWS_EVENTBRIDGE_SOURCE'), ], // ... ],
请确保根据需要定义 环境变量
# both drivers require: AWS_DEFAULT_REGION=you-region AWS_ACCESS_KEY_ID=your-aws-key AWS_SECRET_ACCESS_KEY=your-aws-secret # EventBridge driver only: AWS_EVENTBRIDGE_SOURCE=com.your-app-name
接下来,您需要确保在 .env 文件中使用 sns
广播驱动程序作为默认驱动程序进行广播
BROADCAST_DRIVER=eventbridge
请注意,如果您需要能够同时使用 两个驱动程序,您可以在事件级别定义连接。
用法
只需按照官方文档中解释的默认方式广播 Laravel 事件即可 官方文档。
以类似的方式,您必须确保实现 Illuminate\Contracts\Broadcasting\ShouldBroadcast
接口,并定义您希望广播的频道。
use App\Models\Order; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Broadcasting\InteractsWithBroadcasting; use Illuminate\Queue\SerializesModels; class OrderShipped implements ShouldBroadcast { use SerializesModels; /** * The order that was shipped. * * @var \App\Models\Order */ public $order; /** * Create a new event instance. * * @param \App\Models\Order $order * @return void */ public function __construct(Order $order) { $this->order = $order; $this->broadcastVia('eventbridge'); } /** * Get the topics that model events should broadcast on. * * @return array */ public function broadcastOn() { return ['orders']; // This is the Event bus name } }
广播数据
默认情况下,该包将发布默认的 Laravel 负载,该负载已在广播事件时使用。一旦发布,其 JSON 表示形式可能如下所示
{ "order": { "id": 1, "name": "Some Goods", "total": 123456, "created_at": "2021-06-29T13:21:36.000000Z", "updated_at": "2021-06-29T13:21:36.000000Z" }, "connection": null, "queue": null }
使用 broadcastWith
方法,您将能够定义要发布的确切负载类型。
/** * Get and format the data to broadcast. * * @return array */ public function broadcastWith() { return [ 'action' => 'parcel_handled', 'data' => [ 'order-id' => $this->order->id, 'order-total' => $this->order->total, ], ]; }
现在,当事件被触发时,它将表现得像一个标准的Laravel事件,这意味着其他监听器可以像往常一样监听它,但它还会通过使用broadcastWith
方法定义的负载向由broadcastOn
方法定义的主题广播。
广播名称/主题
在发布/订阅(Pub/Sub)上下文中,为每个通知指定一个要广播到SNS的Subject
可能很有用。这可以是一个轻松配置监听器的方法,以便您可以在队列中接收和处理特定类型的主题。
默认情况下,该包将使用标准的Laravel广播名称来定义发送通知的Subject
。您可以随意自定义它。
/** * The event's broadcast name/subject. * * @return string */ public function broadcastAs() { return "orders.{$this->action}"; }
模型广播
如果您熟悉模型广播,您已经知道Eloquent模型在其生命周期中会触发多个事件并相应地广播它们。
在模型广播的上下文中,只有以下模型事件可以广播
created
updated
deleted
trashed
如果启用了软删除restored
如果启用了软删除
为了广播模型事件,您需要在您的模型上使用Illuminate\Database\Eloquent\BroadcastsEvents
特性,并遵循官方文档。
您可以在您的模型上使用broadcastOn()
、broadcastWith()
和broadcastAs()
方法来自定义主题名称、负载和主题。
注意:模型广播仅在Laravel 8.x中可用。
致谢
- laravel-aws-pubsub为我们提供了一些灵感
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。