ensi / laravel-initial-event-propagation
Laravel 初始事件传播
Requires
- php: ^8.1
- ensi/initial-event-propagation: ^0.3.0
- laravel/framework: ^9.0 || ^10.0 || ^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.2
- orchestra/testbench: ^7.0 || ^8.0 || ^9.0
- pestphp/pest: ^1.22 || ^2.0
- pestphp/pest-plugin-laravel: ^1.1 || ^2.0
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.11
- spaze/phpstan-disallowed-calls: ^2.15
README
提供了一组可直接使用的中间件,以集成 ensi/initial-event-propagation 到 Laravel 应用程序中。您可以自由地用您自己的实现替换其中的任何一个。
安装
您可以通过 composer 安装此包
composer require ensi/laravel-initial-event-propagation
发布配置文件如下
php artisan vendor:publish --provider="Ensi\LaravelInitialEventPropagation\LaravelInitialEventPropagationServiceProvider"
版本兼容性
基本用法
$holder = resolve(InitialEventHolder::class); var_dump($holder->getInitialEvent()); $holder->setInitialEvent(new InitialEventDTO(...));
您必须始终从服务容器解析 InitialEventHolder,而不是使用 InitialEventHolder::getInstance
。这是为了与 Laravel Octane 兼容。
HTTP 请求
设置初始事件
当您收到来自您不拥有的客户端的 HTTP 请求时,通常会在 API 网关中创建一个新的初始事件。例如。
为此有一个内置的 Ensi\LaravelInitialEventPropagation\SetInitialEventHttpMiddleware
。
它创建一个 InitialEventDTO
并将其放置到 InitialEventHolder
单例中。
userId
和entrypoint
从请求中设置。app
根据配置选项设置。userType
从包配置中设置。对于未认证的用户,userType
为空。correlationId
和timestamp
根据配置选项从请求头设置,或者从头开始生成。realUserId
、realUserType
和misc
留为空字符串。
确保在设置认证用户的 Laravel 中间件之后添加中间件。
在实践中,这通常意味着您必须在 app/Http/Kernel
中的 middlewareGroups
的底部放置中间件。
解析传入的初始事件
将 Ensi\LaravelInitialEventPropagation\ParseInitialEventHeaderMiddleware
添加到 app/Http/Kernel
的中间件属性中。
此中间件解析 X-Initial-Event
HTTP 头,将其反序列化为 InitialEventDTO
对象,并将其放置到 InitialEventHolder
单例中。
将初始事件传播到出站 HTTP 请求
此包提供了一个 Ensi\LaravelInitialEventPropagation\PropagateInitialEventLaravelGuzzleMiddleware
Guzzle 中间件,该中间件将 resolve(InitialEventHolder::class)->getInitialEvent()
转换回 X-Initial-Event
头,并将此头设置到所有出站的 guzzle 请求中。
您可以将它添加到您的 guzzle 栈中,如下所示
$handlerStack = new HandlerStack(Utils::chooseHandler()); $handlerStack->push(new PropagateInitialEventLaravelGuzzleMiddleware());
命令行界面
Artisan 命令
有一个自定义 artisan Ensi\LaravelInitialEventPropagation\SetInitialEventArtisanMiddleware
,它将新初始事件设置在您运行的每个 artisan 命令中。您可以将它添加到 app\Console\Kernel
中,如下所示
public function bootstrap() { parent::bootstrap(); (new SetInitialEventArtisanMiddleware())->handle(); }
此中间件将 artisan 命令名称(包括参数,不包括选项)设置为 $initialEventDTO->entrypoint
。
如果您的自定义 artisan 命令向其他应用程序发送 guzzle HTTP 请求,则 PropagateInitialEventGuzzleMiddleware
将使用此初始事件。
此中间件也适用于 Laravel 任务调度。
队列作业
您通常希望在传入 HTTP 请求和队列作业之间持久化初始事件。
此包可以帮助您做到这一点。不幸的是,您需要触摸特定的作业
use Ensi\LaravelInitialEventPropagation\Job; // Extend the job from package class TestJob extends Job implements ShouldQueue { public function __construct(protected Customer $customer) { // Do not forget to call parent constuctor parent::__construct(); } public function handle() { // InitialEvent is automatically persisted to InitialEventHolder via job middleware in parent class, // You do not need to persist it manually } }
Laravel 可队列操作
如果您使用 spatie/laravel-queueable-action 包来调度操作而不是作业,那么您不需要分别与每个作业打交道。
只需发布 laravel-queueable-action
配置,并将特殊的作业类设置在那里
'job_class' => \Ensi\LaravelInitialEventPropagation\ActionJob::class,
贡献
请参阅CONTRIBUTING获取详细信息。
测试
- composer install
- composer test
安全漏洞
请查看我们的安全政策,了解如何报告安全漏洞。
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。