我在我的Laravel 8应用程序中有两个数据库。这两个数据库的用户名和密码是相同的,但是数据库名是不同的。因此,我创建了一个中间件,它根据用户的电子邮件设置数据库名称。
问题是,我在数据库queue_connection上有一个作业,但是当工作人员试图检索作业时,中间件不会得到调用,而worker只在默认数据库中查找作业。
如何设置数据库名称,使工作人员可以从所需的数据库中检索作业,而不是默认的数据库。
中间件
public function handle(Request $request, Closure $next)
{
$auth_email = Auth::guard('api')->user()?->email;
if ($auth_email === 'first_user@example.com') {
config(['database.connections.fe_mysql.database' => 'Database-1']);
} elseif ($auth_email === 'second_user@example.com') {
config(['database.connections.fe_mysql.database' => 'Database-2']);
}
return $next($request);
}更新
Laravel请求具有默认数据库连接的数据库,在此请求期间,Auth::user()是null,因为请求中没有发送访问令牌。
因此,问题是如何根据登录的电子邮件更改数据库连接。我尝试将电子邮件存储在session中,如下所示
session(['adminEmail' => \request('email')]);现在从会话中检索此电子邮件并根据电子邮件设置数据库如下
$auth_email = session('adminEmail');
if ($auth_email === 'first_user@example.com') {
config(['database.connections.fe_mysql.database' => 'Database-1']);
} elseif ($auth_email === 'second_user@example.com') {
config(['database.connections.fe_mysql.database' => 'Database-2']);
}
return $next($request);
}以上代码的问题是,每当用户登录时,会话值将继续更改,因此我不能以这种方式依赖会话值。
发布于 2022-08-04 21:44:21
我也被困在这个问题上,直到我意识到DB连接没有被清除。
一旦设置了新的DB配置,就需要purge连接。
DB::purge('mysql');是您要寻找的代码。
use Illuminate\Support\Facades\DB;
public function handle(Request $request, Closure $next)
{
$auth_email = Auth::guard('api')->user()?->email;
if ($auth_email === 'first_user@example.com') {
config(['database.connections.fe_mysql.database' => 'Database-1']);
} elseif ($auth_email === 'second_user@example.com') {
config(['database.connections.fe_mysql.database' => 'Database-2']);
}
DB::purge('mysql');
return $next($request);
}此外,我还有几个问题,可以更好地回答你的情况。
当您正在用result?
email时,这已经连接到另一个DB假设这是您想要的Database-2
,您已经在Kernal.php
queue_connection DB符合Database-1和Database-2的总体方案
https://stackoverflow.com/questions/73238610
复制相似问题