Laravel多租户(多模式)由于队列失败

时间:2019-09-27 17:13:58

标签: laravel multi-tenant

因此,我在laravel中创建了一个多租户的很大一部分api。有一个jwt发行,带有用户ID和租户ID。在经过身份验证的请求上,我使用令牌中的租户覆盖数据库配置中的postgres模式。它适合所有请求,直到我进入队列。我现在意识到,当我将作业,事件,通知等排队时,它正在公共模式中进行查找(我应该期望如此)。但是,经过一整天的代码和文档挖掘,我看不到为排队作业设置架构的任何方法。我有解决它的方法(将其作为参数传递并在构造函数中设置模式),但是它是重复的,而且我还没有在通知中找到解决方法(如果我要通知用户,它是“在_wakeup()处查找正确的用户将失败。我不确定我可以共享什么代码来帮助解决这个问题,因为这不是实现问题,而更多是“我不知道如何实现”问题。

我知道我可能会创建一个覆盖架构的作业,然后THEN同步发送通知,但是同样,我陷入了一个非常棘手的领域。

1 个答案:

答案 0 :(得分:1)

我实现了一个多租户应用程序,并遇到了同样的问题。可悲的是,在分派工作时没有办法挂上工作。

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

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);