behzadsh / rabbitmq-broadcaster
一个 Laravel 事件广播器,可以将事件广播到扇出或主题 RabbitMQ 交换。
v0.1.0
2023-04-23 21:43 UTC
Requires
- php: ^8.2
- ext-json: *
- illuminate/broadcasting: ^9.0|^10.0
- illuminate/contracts: ^9.0|^10.0
- illuminate/http: ^9.0|^10.0
- illuminate/support: ^9.0|^10.0
- php-amqplib/php-amqplib: ~3.5
README
Laravel 事件广播模块的主要重点是使应用程序客户端之间的通信成为可能。然而,它也可以在微服务架构中用于服务之间的异步通信和消息传递。
此包提供了一个简单的方式来将 Laravel 事件广播到 RabbitMQ 服务器,使您能够异步发送消息,并促进微服务架构中服务之间的通信。
安装
要安装包,运行以下命令
composer require behzadsh/rabbitmq-broadcaster
安装包后,将以下配置片段添加到您的 broadcasting.php
配置文件中
<?php return [ // ... 'connections' => [ // other connections config 'rabbitmq' => [ 'driver' => 'rabbitmq', 'connection' => [ 'host' => env('RABBITMQ_HOST', 'localhost'), 'port' => env('RABBITMQ_PORT', 5672), 'user' => env('RABBITMQ_USER', 'guest'), 'password' => env('RABBITMQ_PASSWORD', 'guest'), ], 'default_exchange_type' => 'fanout', // It can be `fanout` or `topic` 'exchange_configs' => [ // optional 'exchange1' => [ 'type' => 'fanout', 'passive' => false, 'durable' => true, 'auto_delete' => false, 'internal' => false, ], 'exchange2' => [ 'type' => 'topic', 'passive' => false, 'durable' => false, 'auto_delete' => true, 'internal' => false, ], ], ], ], ];
然后,将包服务提供者添加到您的 app.php
配置文件中的 providers
列表末尾
<?php return [ // ... 'providers' => [ // Other service providers... Behzadsh\RabbitMQBroadcaster\RabbitMQBroadcasterServiceProvider::class, ] // ... ];
使用方法
要使用 RabbitMQ 事件广播器,您的所需事件类必须实现 Illuminate\Contracts\Broadcasting\ShouldBroadcast
接口,这要求您实现 broadcastOn
方法。`broadcastOn` 方法应返回事件应广播到的频道或频道数组。
由于此包主要用于内部后端服务之间的通信,频道不是公开的,且不允许客户端应用程序访问这些频道。因此,建议您避免使用 `PrivateChannel`、`PresenceChannel` 和 `EncryptedPrivateChannel`,而使用简单的 `Channel`。
<?php namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class UserRegistered implements ShouldBroadcast { /** * Create a new event instance. */ public function __construct( public int $userId, public string $name, public string $email, ) {} /** * Get the channels the event should broadcast on. * * @return array<int, \Illuminate\Broadcasting\Channel> */ public function broadcastOn(): array { return [ new Channel('user.events'), ]; } }
如果您使用 Eloquent 模型构建事件,建议实现 broadcastWith
方法。`broadcastWith` 方法应返回一个可以序列化为 JSON 的数组。
<?php namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Queue\SerializesModels; class ServerCreated implements ShouldBroadcast { use SerializesModels; /** * Create a new event instance. */ public function __construct( public User $user, ) {} /** * Get the channels the event should broadcast on. * * @return array<int, \Illuminate\Broadcasting\Channel> */ public function broadcastOn(): array { return [ new Channel('user.events'), ]; } /** * Get the data to broadcast. * * @return array<string, mixed> */ public function broadcastWith(): array { return [ 'userId' => $this->user->id, 'name' => $this->user->name, 'email' => $this->user->email, ]; } }