rabbitevents/publisher

RabbitEvents 包的 Publisher 组件。

v8.2.1 2024-04-29 10:52 UTC

README

RabbitEvents Publisher 组件提供了一个 API,用于在整个应用程序结构中发布事件。更多详细信息请参阅 Nuwber 的 RabbitEvents 文档

RabbitEvents Publisher 是通知所有其他微服务支付成功的部分。

目录

  1. 通过 Composer 安装
  2. 配置
  3. 发布
  4. 测试

通过 Composer 安装

RabbitEvents Publisher 可以通过 Composer 包管理器安装

composer require rabbitevents/publisher

安装 Publisher 后,您可以执行 rabbitevents:install Artisan 命令,该命令将 RabbitEvents 配置文件安装到您的应用程序中

php artisan rabbitevents:install

配置

有关配置的详细信息请参阅库 文档

发布

使用事件类

以下是一个示例事件类

<?php

use App\Payment;
use App\User;
use RabbitEvents\Publisher\ShouldPublish;
use RabbitEvents\Publisher\Support\Publishable;

class PaymentSucceededRabbitEvent implements ShouldPublish
{
    use Publishable;

    public function __construct(private User $user, private Payment $payment)
    {
    }

    public function publishEventKey(): string
    {
        return 'payment.succeeded';
    }

    public function toPublish(): mixed
    {
        return [
            'user' => $this->user->toArray(),
            'payment' => $this->payment->toArray(),
        ];
    }
}

事件类的要求是实现 \RabbitEvents\Publisher\ShouldPublish 接口。

作为替代,您也可以扩展 \RabbitEvents\Publisher\Support\AbstractPublishableEvent。这个类是为了简化事件类的创建而创建的。

发布 此事件,您只需调用事件类的 publish 方法并传递所有必要的数据

<?php

$payment = new Payment(...);

// ...

PaymentSucceededRabbitEvent::publish($request->user(), $payment);

publish 方法由 Publishable 特性提供。

使用 publish 函数

有时,使用带有事件键和负载的辅助函数 publish 更容易

<?php

publish(
    'payment.succeeded',
    [
        'user' => $request->user()->toArray(),
        'payment' => $payment->toArray(),
    ]
);

使用 publish 函数发布事件对象

您也可以结合使用上述两种方法

<?php

$event = new PaymentSucceededEvent($request->user(), $payment);

event($event)
publish($event);

测试

我们总是编写测试。我们应用程序中的测试包含许多模拟和伪装来测试事件是如何发布的。

PublishableEventTesting 特性,它为想要测试的事件类提供断言方法。

Event.php

<?php

namespace App\BroadcastEvents;

use Nuwber\Events\Event\Publishable;
use Nuwber\Events\Event\ShouldPublish;
use Nuwber\Events\Event\Testing\PublishableEventTesting;

class Event implements ShouldPublish
{
    use Publishable;
    use PublishableEventTesting;

    public function __construct(private array $payload) 
    {
    }

    public function publishEventKey(): string
    {
        return 'something.happened';
    }

    public function toPublish(): array
    {
        return $this->payload;
    }
}

Test.php

<?php

use \App\RabbitEvents\Event;
use \App\RabbitEvents\AnotherEvent;

Event::fake();

$payload = [
    'key1' => 'value1',
    'key2' => 'value2',
];

Event::publish($payload);

Event::assertPublished('something.happened', $payload);

AnotherEvent::assertNotPublished();

如果断言未通过,将抛出 Mockery\Exception\InvalidCountException
不要忘记在 tearDown 或类似测试方法的测试中调用 \Mockery::close()