dkhorev / laravel-ampq
RabbitMQ 在 Laravel 中的 Pub/Sub。
1.0.7
2022-04-05 15:45 UTC
Requires
- php: >=8.0||>=7.4
- ext-json: *
- php-amqplib/php-amqplib: ^v3.0.0
Requires (Dev)
- orchestra/testbench: ^v6.14.0
This package is auto-updated.
Last update: 2024-09-19 22:48:40 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!']);