Laravel 多租户(多模式)因队列而失败

Laravel Multi-Tenant (multi-schema) fails with queues

所以我在 laravel 中创建了一大块 api 是多租户的。发布了一个带有用户 ID 和租户 ID 的 jwt。在经过身份验证的请求中,我使用令牌中的租户来覆盖数据库配置中的 postgres 模式。它适用于所有请求,直到我进入队列。我现在意识到,当我对作业、事件、通知等进行排队时,它正在查找 public 模式(我早该预料到)。但是,在对代码和文档进行了一整天的挖掘之后,我看不出有什么方法可以为排队的作业设置架构。我有办法绕过它(将它作为参数传递并在构造函数中设置架构)但它是重复的而且我还没有找到在通知中这样做的方法(如果我通知用户,它'将无法在 _wakeup() 中查找正确的用户)。我不确定我可以分享哪些代码来帮助解决这个问题,因为它不是一个实施问题,而是一个 "I have no idea how to implement" 问题。

我知道我可能会创建一个覆盖架构的作业,然后同步发送通知,但我再次陷入了非常棘手的境地。

我实施了一个多租户应用程序并且 运行 遇到了同样的问题。可悲的是,在派遣工作时无法挂钩。

我创建了一个简单的特征来防止使用租户参数使所有作业混乱:

trait TenantAware
{
    protected $tenant;

    public static function dispatchForTenant(Tenant $tenant, ...$args)
    {
        return new PendingDispatch(
            (new static(...$args))->withTenant($tenant)
        );
    }

    public function withTenant(Tenant $tenant)
    {
        $this->tenant = $tenant;

        return $this;
    }
}

然后您可以使用job events设置您的模式:

Queue::before(function (JobProcessing $event) {
    // TODO: Retrieve tenant from job payload and set PostgreSQL schema.
});
Queue::after(function (JobProcessing $event) {
    // TODO: Reset PostgreSQL schema.
});

并发送:

SendInvoiceExampleJob::dispatchForTenant($tenant, $user, invoice);