behzadsh/rabbitmq-broadcaster

一个 Laravel 事件广播器,可以将事件广播到扇出或主题 RabbitMQ 交换。

v0.1.0 2023-04-23 21:43 UTC

This package is auto-updated.

Last update: 2024-09-24 01:05:44 UTC


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,
        ];
    }
}