2017-02-16 10 views
1

ユーザログイン後にデータベース接続を実行時に変更したい。私はConfig Facadeのメソッドセットを使用します。ミドルウェアまたはコントローラのコンストラクタでのみ使用できることはわかっています。だから私はこれらの実行時のLaravelデータベースパラメータの変更

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

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

を作成した。そして、私はログインが提出した後に呼ばれる「テスト」ミドルウェアを作成:

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"

私は、顧客ごとに1つのマルチDB接続を使用します。

+0

もし私が提案をするかもしれません。あなたは、このロジックをイベント 'auth.login'のリスナーに入れれば、自分で簡単にすることができます。その場合、 'LoginFailedException'を投げたり、ユーザー名とパスワードを検証したりすることを心配する必要はありません。 – 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)); 

そしてDBに再接続:このproblを持っているすべてのための

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

私のアドバイスemは、db(サーバーdb)とcustomer dbの2つのdb接続を使用しています。あなたは、顧客DBを選択することができます第二に、あなたがそれに接続することができ、最初のコマンドで

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

:この方法では、この単純なコードで、両方のDBに切り替えることができます。

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; 
} 
関連する問題