我使用Laravel 5.3。我在env文件中定义了与数据库的连接。
我使用多个MySQL服务器,如果一个关闭,我想自动使用第二个连接。
我会使用我认为的过滤器并捕获PDOException。
但我想知道Laravel是否有更好的方法来做到这一点,我想只使用config / env。
答案 0 :(得分:2)
使用中间件时,您可以尝试/捕获请求中的异常,然后切换连接。不确定这是否适用于控制台或迁移。可能不是。
在您的应用程序中添加此中间件:
namespace App\Http\Middleware;
use Closure;
use DB;
class SwitchConnection
{
public function handle($request, Closure $next)
{
try {
return $next($request);
} catch (\Exception $e) { //Use a proper exception here, depending on which way/database you are connecting
$this->switchConnection();
return $next($request);
}
}
private function switchConnection()
{
//here get all connections from config that applies
//@todo use a better way to get those db names
$dbNames = ['conn1', 'conn2', 'conn3',];
foreach($dbNames as $dbName) {
try {
\DB::connection($dbName)->getDatabaseName();
\Config::set('database.default', $dbName);
return;
} catch (\Exception $e) {
continue;
}
}
}
}
添加 Kernel.php
protected $routeMiddleware = [
...
'switchConnection' => \App\Http\Middleware\SwitchConnection::class,
然后在你的 routes.php 中你可以这样做:
Route::group('middleware' => ['switchConnection']], function(){
.... //your routes go here
});