vmorozov / event-backbone-laravel
Laravel 包,方便使用 Event Backbone (Apache Kafka) 实现基于事件的微服务通信。
dev-master
2023-11-01 06:25 UTC
Requires
- php: ^8.1
- ext-rdkafka: *
- illuminate/contracts: >=9.0
- spatie/laravel-package-tools: ^1.9.2
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^6.0
- orchestra/testbench: ^7.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-29 20:43:22 UTC
README
此包用于方便地使用 Event Backbone (目前仅支持 Apache Kafka) 实现基于事件的微服务通信。
安装
您可以通过 composer 安装此包
composer require vmorozov/event-backbone-laravel
您需要使用以下命令发布配置文件:
php artisan vendor:publish --tag="event-backbone-laravel-config"
使用方法
生产事件
要开始生产事件,您需要创建第一个实现 Vmorozov\EventBackboneLaravel\Producer\ExternalEvent
接口的事件。
<?php namespace App\Events; use App\Models\User; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; use Vmorozov\EventBackboneLaravel\Producer\ExternalEvent; class UserCreated implements ExternalEvent { use Dispatchable, InteractsWithSockets, SerializesModels; private User $user; public function __construct(User $user) { $this->user = $user; } public function getTopic(): string { return 'users'; } public function getName(): string { return 'user_created'; } public function getKey(): string { return $this->user->getKey(); } public function getPayload() { return $this->user->toJson(); } public function getHeaders(): array { return []; } }
然后,您需要触发之前步骤中创建的事件。
use App\Events\UserCreated; // some code here event(new UserCreated($user));
消费事件
要开始消费事件,您需要创建第一个实现 Vmorozov\EventBackboneLaravel\Consumer\ExternalConsumedEvent
接口的事件,并为其创建 Laravel 事件监听器。
以下是在 "生产事件" 部分中生产事件的示例。
创建事件
<?php namespace App\Events; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; use Vmorozov\EventBackboneLaravel\Consumer\ExternalConsumedEvent; class UserCreatedConsumedEvent implements ExternalConsumedEvent { use Dispatchable, InteractsWithSockets, SerializesModels; private array $payload; public function __construct(array $payload) { $this->payload = $payload; } public function getId() { return $this->payload['id']; } public function getName(): string { return $this->payload['name']; } public function getEmail(): string { return $this->payload['email']; } }
创建监听器
<?php namespace App\Listeners; use App\Events\UserCreatedConsumedEvent; use App\Models\User; use Illuminate\Contracts\Queue\ShouldQueue; class UserCreatedListener implements ShouldQueue { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param object $event * @return void */ public function handle(UserCreatedConsumedEvent $event): void { if (User::query()->find($event->getId())) { return; } User::unguard(); User::query()->create([ 'id' => $event->getId(), 'name' => $event->getName(), 'email' => $event->getEmail(), ]); } }
在 EventServiceProvider
中注册您的监听器
protected $listen = [ \App\Events\UserCreatedConsumedEvent::class => [ \App\Listeners\UserCreatedListener::class, ], ];
要开始消费事件,请运行以下 artisan 命令
php artisan event_backbone:consume
配置
上下文功能
事件可以包含额外的上下文,以便在接收到事件时切换应用状态。要启用此功能,您需要在您的应用程序中添加两个类:ContextProvider 和 Context applier,并在配置中注册它们。
- 创建应用类
<?php namespace App\Utils\EventBackbone; use Vmorozov\EventBackboneLaravel\Producer\Context\ProducedEventContextProvider; use Vmorozov\LaravelFluentdLogger\Tracing\TraceStorage; class ContextProvider implements ProducedEventContextProvider { private TraceStorage $traceStorage; public function __construct(TraceStorage $traceStorage) { $this->traceStorage = $traceStorage; } public function getContext(): array { return [ 'trace_id' => $this->traceStorage->getTraceId(), ]; } }
- 创建上下文应用类
<?php namespace App\Utils\EventBackbone; use Vmorozov\EventBackboneLaravel\Consumer\Context\ConsumedEventContextApplier; use Vmorozov\LaravelFluentdLogger\Tracing\TraceStorage; class ContextApplier implements ConsumedEventContextApplier { private TraceStorage $traceStorage; public function __construct(TraceStorage $traceStorage) { $this->traceStorage = $traceStorage; } public function apply(array $context): void { $this->traceStorage->setTraceId($context['trace_id']); } }
- 在
event-backbone-laravel.php
配置中注册创建的类
'context' => [ 'provider_class' => \App\Utils\EventBackbone\ContextProvider::class, 'applier_class' => \App\Utils\EventBackbone\ContextApplier::class, ],
测试
composer test
变更日志
有关最近更改的更多信息,请参阅 CHANGELOG。
贡献
有关详细信息,请参阅 CONTRIBUTING。
安全漏洞
有关如何报告安全漏洞的详细信息,请参阅 我们的安全策略。
致谢
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。