dkhorev/laravel-ampq

RabbitMQ 在 Laravel 中的 Pub/Sub。

安装: 96

依赖者: 0

建议者: 0

安全: 0

星标: 2

关注者: 1

分支: 0

公开问题: 2

类型:模块

1.0.7 2022-04-05 15:45 UTC

README

RabbitMQ 在 Laravel 中的 Pub/Sub。

安装

composer require dkhorev/laravel-ampq

发布配置

php artisan vendor:publish --tag=laravel-ampq --force

监听器

laravel-ampq.cfg 中设置您的监听器

'callbacks' => [
    'example_stack' => [
        'exchange' => [
            'topic' => ExampleListenerCallback::class,
        ],
    ],
],

这将监听 "exchange:topic" 上的消息并将任何消息传递给 ExampleListenerCallback->__invoke() 方法

每个监听器都应该实现 AmpqListenCallbackContract (实现 __invoke() 方法)

use dkhorev\LaravelAmpq\Contracts\AmpqListenCallbackContract;
use PhpAmqpLib\Message\AMQPMessage;

class MyTopicCallback implements AmpqListenCallbackContract
{
    public function __invoke(AMQPMessage $msg): void
    {
        // TODO: Implement __invoke() method.
    }
}

建议仅在回调中对消息进行基本验证,并将任何重型处理作业(例如 redis 或其他)排队

监听命令

php artisan ampq:listen {connection} {listenStack}

connection - 来自配置文件 servers 数组的连接名称

listenStack - 来自配置文件 callbacks 数组的监听通道堆栈

发送消息

要使用此包发送消息,您可以使用 laravel-ampq.cfg 中的任何连接

使用 "local" 连接(示例)

use dkhorev\LaravelAmpq\Clients\AmpqClient;
use dkhorev\LaravelAmpq\Contracts\SendToTopicServiceContract;

$config = config('laravel-ampq.servers.local');

$client =  new AmpqClient($config['host'], $config['user'], $config['password'], (int)$config['port']);
$sender = resolve(SendToTopicServiceContract::class);
$sender->postTo($client, 'some-exchange', 'some-topic', ['exapmple-data' => 'hello world!']);

创建自定义客户端连接

将自定义服务器添加到配置中

'servers' => [
    'custom' => [
    ...
    ],
],

从本包扩展 AmpqClient 并创建一个接口,例如 AmpqClientCustomInterface

use dkhorev\LaravelAmpq\Clients\AmpqClient;

class AmpqClientCustom extends AmpqClient implements AmpqClientCustomInterface
{}

在您的 AppServiceProvider 中将新的接口 AmpqClientCustomInterface 绑定到自定义服务器以进行解析

$this->app->bind(
    AmpqClientCustomInterface::class,
    static function () {
        $config = config('laravel-ampq.servers.custom');

        return new AmpqClientCustom($config['host'], $config['user'], $config['password'], $config['port']);
    }
);

发送消息

use dkhorev\LaravelAmpq\Contracts\SendToTopicServiceContract;

$sender = resolve(SendToTopicServiceContract::class);
$client = resolve(AmpqClientCustomInterface::class);

$sender->postTo($client, 'some-exchange', 'some-topic', ['exapmple-data' => 'hello world!']);