在Login - Laravel期间在config中设置动态数据库

Lan*_*gel 4 php mysql database dynamic laravel

我正在尝试根据用户的公司更改登录时的数据库连接.在这里,我的用户有一家公司,其DB是companyA.

下面是我更改连接的LoginController:

public function authenticated(Request $request,User $user)
{
    \Config::set('database.connections.dynamicdb', array(
        'driver'    => 'mysql', 
        'host'      => '127.0.0.1',
        'database'  =>  $user->company,
        'username'  =>  'root',
        'password'  =>  '',
        'charset'   => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'strict'    => false,
        'options'   => [                                
            \PDO::ATTR_EMULATE_PREPARES => true
        ]
    ));

    return redirect()->intended($this->redirectPath());
}
Run Code Online (Sandbox Code Playgroud)

因此,基于已在users表中定义的user-> company,更改了数据库名称.但不知怎的,它不起作用.

未选择数据库中显示的错误.

我尝试下面的代码来检查登录期间是否设置了值.

return \Config::get('database.connections.dynamicdb');
Run Code Online (Sandbox Code Playgroud)

它显示所有值都符合我的要求.但是当我在登录后检查并到达/ home时,config中的数据库值为null.

那么我应该做些什么改变呢.我的技术对吗?或者还有其他任何解决方案.

在我的股票模型中,我添加了以下行:

protected $table = 'stocks';  
protected $connection = 'dynamicdb';
Run Code Online (Sandbox Code Playgroud)

我正在运行的查询只是一个获取所有查询:

 Stock::orderBy('tag_no','asc')->get()
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么会这样?我该怎么办?

Zaq*_*uPL 5

所有请求都是无状态的,因此当前请求不知道您在先前的请求中设置了新的配置值.

Config::set(...)每次要使用动态数据库并设置数据库名称从User实例获取此值时,都应该调用.

应使用中间件服务提供商完成上述设置.

创建新的中间件并将其注册到web中间件组(您可以使用HTTP内核的$ middlewareGroups属性执行此操作):

protected $middlewareGroups = [
    'web' => [
        //...
        \App\Http\Middleware\YourMiddleware::class,
    ],
    //...
];
Run Code Online (Sandbox Code Playgroud)

然后:

<?php namespace App\Http\Middleware;

class YourMiddleware
{
    public function handle($request, Closure $next)
    {
        if (Auth::check()) {
            $database_name = Auth::user()->company;

            // Set your config here using $user->company
            // ...
        }

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果必须设置此值一次(在身份验证期间),则应将上述代码和会话组合在一起以在请求之间存储此信息:

session(['db_name' => $dbname]); // Set db_name and store it

$db_name = session('db_name'); // Get db_name from session
Run Code Online (Sandbox Code Playgroud)

阅读有关HTTP会话的更多信息:https://laravel.com/docs/5.7/session#retrieving-data