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);
所以我在 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);