十二面体/laravel-app-events

使用 Google Cloud PubSub 管理SOA的全局事件

v1.5.9 2023-11-10 13:44 UTC

README

安装

使用 Composer 通过 composer require decahedron/laravel-app-events 安装

用法

在此包中实现的 App Event 仅是一个常规的 Laravel 作业类,它通过 dispatch 方法正常分发。

分发(广播)事件

当你分发一个应用事件时,你必须提供一个事件名称和一个 protobuf 消息形式的负载。

dispatch(new AppEvent('user.created', new User(['name' => $user->name])));

为了正确编码,你还必须提供一个从名称到类实现的映射。这允许包以不局限于 PHP 的方式编码消息,从而允许将消息解码为 protobuf 结构的任何支持 protobuf 的语言。

广播配置

return [
    'enabled' => true,
    'project_id' => 'your-google-project',
    'topic' => 'app-events',
    'subscription' => 'login-handler'

    'mappings' => [
        'User' => App\Proto\User::class,
    ],
];

处理事件

事件可以被任何能够与 Google Cloud PubSub 通信的应用处理,并且是用可以处理 protobuf 的语言编写的。

为了处理此包的事件,你的处理应用(可能和分发应用相同)必须包含以下配置。

return [
    'enabled' => true,
    'project_id' => 'your-google-project',
    'topic' => 'app-events',
    'subscription' => 'user-registrator',

    'mappings' => [
        'User' => App\Proto\User::class,
    ],
    
    'handlers' => [
        'user.created' => App\Auth\RegisterUser::class,
    ],
];

这里指定的处理程序必须是一个具有 handle 方法的类,该方法接受 protobuf 消息作为参数。此类通过 Laravel 容器解析,因此你可以使用构造函数注入。

class RegisterUser
{
    protected $registrator;

    public function __construct(Registrator $registrator)
    {
        $this->registrator = $registrator;
    }

    public function handle(User $user)
    {
        $this->registrator->register(
            $user->getName(),
            $user->getEmail(),
        );
    }
}

请注意,这里仍然需要 mappings,以便将数据转换回正确的 protobuf 消息。因此,将您的基配置(不包括订阅名称和处理程序)放在共享位置可能会有所帮助,这样就可以一次更新所有位置。