在config/database.php
我有两个关联:mysql
和website
。两者都连接到同一主机,只是数据库不同。默认值为mysql
。
我创建了一个名为SetupWebsite
的中间件,用于检查默认连接中数据库中是否存在传入域。如果是,则使用以下代码填充website
与正确数据库的连接:
config(['database.connections.website.database' => $database]);
然后,它将默认连接切换为website
:
config(['database.default' => 'website']);
我通过从数据库中检索仅存在于website
连接中的值来验证默认连接现在为website
。我还可以登录website
连接中的用户帐户。现在,当我设置以下路线时:
Route::get('admin', function () {
return 'Welcome to the dashboard!';
})->middleware('auth');
我成功登录后去那里,我收到'tbl_users不存在'的错误消息,我看到它使用mysql
连接来检查用户是否经过身份验证。我没有想法如何告诉Laravel我正在使用另一个数据库连接。 FIY:我没有缓存配置。
当我将以下代码添加到Illuminate\Auth\Middleware\Authenticate::class
的构造函数时:
DB::setDefaultConnection('website');
我收到没有选择数据库的错误消息,这意味着在我的SetupWebsite
中间件发挥其魔力之前,'创建'了auth中间件。有什么建议我可以解决这个问题吗?
答案 0 :(得分:2)
呐喊!我找到了解决方法。就像我在我的问题中所说的,看起来auth中间件是在我自己的中间件之前设置的,这导致auth中间件使用启动时已知的默认连接,即mysql
。因此,我决定将auth中间件复制粘贴到一个名为AwesomeAuthMiddleware
之类的新中间件,然后使用该中间件。那很有效!
答案 1 :(得分:1)
对于其他人来说,我在Laravel Passport和多租户方面遇到了同样的问题。我也有一个通用数据库,每个租户都有另一个数据库。有一个比复制上面的auth中间件简单的解决方案。只需使用Laravel的中间件优先级即可。
在Kernel.php
中,您拥有属性$middlewarePriority
,只需在Laravel身份验证中间件之前添加数据库更改中间件即可。
/**
* The priority-sorted list of middleware.
*
* This forces non-global middleware to always be in the given order.
*
* @var array
*/
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
// Always connect to the DB first, before executing AUTH middleware
\App\Http\Middleware\ConnectToDatabase::class,
\App\Http\Middleware\Authenticate::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];