如果在Laravel 5.3中失败,则自动连接到另一个数据库

时间:2016-11-17 18:23:31

标签: php mysql laravel

我使用Laravel 5.3。我在env文件中定义了与数据库的连接。

我使用多个MySQL服务器,如果一个关闭,我想自动使用第二个连接。

我会使用我认为的过滤器并捕获PDOException。

但我想知道Laravel是否有更好的方法来做到这一点,我想只使用config / env。

1 个答案:

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