十二面体 / laravel-app-events
使用 Google Cloud PubSub 管理SOA的全局事件
v1.5.9
2023-11-10 13:44 UTC
Requires
- php: >= 7.3
- google/cloud: 0.*
- google/protobuf: ^3.6.0
- illuminate/bus: ^6.0|^7.0|^8.0|^9.0|^10.0
- illuminate/config: ^6.0|^7.0|^8.0|^9.0|^10.0
- illuminate/console: ^6.0|^7.0|^8.0|^9.0|^10.0
- kainxspirits/laravel-pubsub-queue: ~0.4.0|~0.5.0|~0.6.0|~0.7.0|~0.8.0
Requires (Dev)
- mockery/mockery: ^1.2
- phpunit/phpunit: ^8.2
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 消息。因此,将您的基配置(不包括订阅名称和处理程序)放在共享位置可能会有所帮助,这样就可以一次更新所有位置。