2017-02-16 6 views
1

Ich möchte die Datenbankverbindung nach der Benutzeranmeldung in der Laufzeit ändern. Ich benutze den Methodensatz von Config Facade. Ich weiß, dass ich es nur auf Middleware oder Controller-Konstruktor verwenden kann. Also habe ich dieseLaravel Datenbankparameter zur Laufzeit ändern

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

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

Und dann habe ich die "Test" Middleware nach dem Login aufgerufen einreichen:

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); 
} 

Aber die metoed aller() Operatore_Model Rückkehr nicht alles

Logs Diesen Fehler zurücksenden:

"[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"

Ich möchte eine Multi-DB-Verbindung verwenden, eine für jeden Kunden.

+0

Wenn ich einen Vorschlag machen kann. Sie könnten es sich selbst erleichtern, wenn Sie diese Logik für das Ereignis 'auth.login' in einen Listener einfügen. In diesem Fall müssen Sie sich keine Gedanken darüber machen, wie Sie eine "LoginFailedException" - oder "validationg" -Nutzername und ein Passwort eingeben. – user3158900

Antwort

0

ich auf diese Weise gelöst: (.) ​​

Der Teil der Config :: Satz falsch war, den Zugriff auf die Datenbankkonfiguration, sollte ich den Punkt verwenden Stil, in auf diese Weise:

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)); 

Und dann an der DB wieder:

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

Mein Rat für alle, die diese probl haben em, verwendet eine Double-Db-Verbindung, eine für die Haupt-DB (Server-DB) und eine für die Kunden-DB. Auf diese Weise können Sie sowohl db wechseln, mit diesem einfachen Code:

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

Mit dem ersten Befehl können Sie die Kunden DB auswählen und mit dem zweiten können Sie mit ihm verbinden.

0

Wahrscheinlich müssen Sie nur neue Datenbank hinzufügen oder existierendes Objekt mit neuen Anmeldeinformationen klonen und es verwenden. Sie können einige Wrapper schreiben wie:

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; 
}