jobilla/laravel-app-events

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

v1.8.0 2024-06-24 12:21 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支持的任何语言的结构。

广播配置

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消息。因此,将你的基础配置(不包括订阅名称和处理程序)放置在共享位置可能是有益的,这样就可以一次性更新所有位置。