ensi/laravel-initial-event-propagation

0.3.0 2024-06-26 13:01 UTC

This package is auto-updated.

Last update: 2024-08-27 08:54:36 UTC


README

Latest Version on Packagist Tests Total Downloads

提供了一组可直接使用的中间件,以集成 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 单例中。

  • userIdentrypoint 从请求中设置。
  • app 根据配置选项设置。
  • userType 从包配置中设置。对于未认证的用户,userType 为空。
  • correlationIdtimestamp 根据配置选项从请求头设置,或者从头开始生成。
  • realUserIdrealUserTypemisc 留为空字符串。

确保在设置认证用户的 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获取详细信息。

测试

  1. composer install
  2. composer test

安全漏洞

请查看我们的安全政策,了解如何报告安全漏洞。

许可证

MIT许可证(MIT)。请参阅许可证文件获取更多信息。