2017-02-16 3 views
1

Я хочу изменить время выполнения подключения к базе данных после входа в систему. Я использую метод set Config Facade. Я знаю, что могу использовать его только для конструктора Middleware или Controller. Так что я создал этиПараметры параметров базы данных Laravel во время выполнения

Route::get("login", "[email protected]"); 

Route::group(["middleware" => "test"], function() { 
    Route::post("login", "[email protected]"); 
}); 

И тогда я создал "Test" Промежуточное вызывается после входа в систему отправить:

public function handle($request, Closure $next) { 

    // Validazione dei dati 
    $validator = Validator::make($request->all(), [ 
       "codice_azienda" => "required", 
       "username" => "required", 
       "password" => "required" 
    ]); 

    if ($validator->fails()) { 
     return redirect()->back()->withInput()->withErrors($validator); 
    } 

    // Verifico i dati immessi 
    $codice_azienda = $request->get("codice_azienda"); 
    $username = $request->get("username"); 
    $password = $request->get("password"); 

    $objOperatore = new Operatore(); 
    $cliente = $objOperatore->loginOperatore($codice_azienda, $username, $password); 
    if (empty($cliente)) { 
     throw new \App\Exceptions\LoginFailedException; 
    } 

    Config::set("DB_HOST", Crypt::decrypt($cliente->Server)); 
    Config::set("DB_DATABASE", $cliente->NomeDB); 
    Config::set("DB_USERNAME", Crypt::decrypt($cliente->Username)); 
    Config::set("DB_PASSWORD", Crypt::decrypt($cliente->Password)); 

    $operatori = Operatore_Model::all(); 
    \App\Http\Controllers\Log_Controller::debug($operatori, true); 

    return $next($request); 
} 

Но metoed все() из Operatore_Model не возвращает ничего

Журналы вернуть эту ошибку:

"[2017-02-16 16:44:52] local.ERROR: exception 'PDOException' with message 'SQLSTATE[42S02]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Invalid object name 'Operatori'.' in C:\xampp\htdocs\dashboard\www\e730\vendor\laravel\framework\src\Illuminate\Database\Connection.php:323"

Я хочу использовать соединение с несколькими БД, по одному для каждого клиента.

+0

Если я могу сделать предложение. Вы могли бы облегчить себе, если вы поместите эту логику в слушателя для события 'auth.login'. В этом случае вам не придется беспокоиться о том, чтобы выбрасывать «LoginFailedException» или validationg имена пользователей и пароль. – user3158900

ответ

0

Я решил таким образом: (.) ​​

Часть конфигурации :: набор был не прав, чтобы получить доступ к конфигурации базы данных, я должен использовать точку стиль, в таким образом:

Config::set("database.connections.sqlsrv.host", Crypt::decrypt($cliente->Server)); 
Config::set("database.connections.sqlsrv.database", $cliente->NomeDB); 
Config::set("database.connections.sqlsrv.username", Crypt::decrypt($cliente->Username)); 
Config::set("database.connections.sqlsrv.password", Crypt::decrypt($cliente->Password)); 

А затем подключиться к БД:

\Illuminate\Support\Facades\DB::reconnect(); 

Мой совет для всех, которые имеют эту пробл em, используется двойное соединение db, одно для основного db (server db) и одно для db клиента. Таким образом, вы можете переключиться на обоих дб, с помощью этого простого кода:

Config::set("database.default", "sqlsrvCustomer"); 
\Illuminate\Support\Facades\DB::reconnect(); 

С первой команды вы можете выбрать БД клиентов и со вторым вы можете подключиться к нему.

0

Возможно, вам просто нужно добавить новую базу данных или клонировать существующий объект с новыми учетными данными и использовать его. Вы можете написать некоторую обертку, как:

function getClienteDb($cliente) { 
    $clientDb = clone $someWhereGlobalDbConnection; 
    // or just create new connection 
    $clientDb = new ClientDbConnection(); 
    // and if needed - disconnect first db 
    $someWhereGlobalDbConnection->disconnect(); 

    $clientDb->database = $cliente->NomeDB; 
    $clientDb->username = Crypt::decrypt($cliente->Username); 
    // etc... 
    $clientDb->connnect(); 

    return $clientDb; 
} 
Смежные вопросы