您可以使用路由中间件为特定路由设置数据库连接。为此,您需要在数据库配置中设置连接,然后添加中间件。
我在多租户应用程序中使用类似的设置来管理系统与租户数据库连接。数据库配置:
'connections' => [
'system' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'lms'),
'username' => env('DB_USERNAME', 'lms'),
'password' => env('DB_PASSWORD', 'lms'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'tenant' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => '',
'username' => '',
'password' => '',
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
],
我的示例中的中间件强制使用定义为租户的数据库。
use Closure;
use Illuminate\Support\Facades\Config;
class EnforceTenancy
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
Config::set('database.default', 'tenant');
return $next($request);
}
}
然后可以在 kernel.php $routeMiddleware 数组中注册中间件
'tenancy.enforce' => \App\Http\Middleware\EnforceTenancy::class,
然后在你的路由文件中为需要第二个数据库的任何路由应用中间件。