3

我正在构建一个多租户应用程序,使用子域来分隔用户。例如 .myapp.com

我也想给每个租户自己的数据库。

如何检测子域并动态设置数据库?

此外,下面的代码来自官方文档,向我们展示了在设置路由时如何获取子域。但是我们如何将子域值传递给控制器​​函数呢?

Route::group(array('domain' => '{account}.myapp.com'), function()
{

    Route::get('user/{id}', function($account, $id)
    {
        //
    });

});
4

1 回答 1

2

实现此目的的最佳方法是在应用到路由组的前置过滤器中。

Route::group(['domain' => '{account}.myapp.com', 'before' => 'database.setup'], function()
{
    // Your routes...
}

this before filters 获取一个$route参数并$request给它一个参数,所以我们可以使用它$request来获取主机。

Route::filter('database.setup', function($route, $request)
{
    $account = $request->getHost();
}

然后,您可以使用该帐户来调整Config::set过滤器中使用的默认数据库连接。也许您需要首先使用默认连接来获取用户数据库详细信息。

$details = DB::details()->where('account', '=', $account)->first();

// Make sure you got some database details.

Config::set('database.connections.account', ['driver' => 'mysql', 'host' => $details->host, 'database' => $details->database, 'username' => $details->username, 'password' => $details->password]);

Config::set('database.connections.default', 'account');

在运行时创建一个新的数据库连接,然后将默认连接设置为新创建的连接。当然,您可以保留默认设置,只需将所有模型上的连接设置为account.

这应该会给你一些想法。请注意,此代码均未经过测试。

此外,控制器上的每个方法都将接收域作为第一个参数。因此,如果您期望其他参数,请务必进行调整。

于 2013-06-02T04:53:22.840 回答