Laravel4中的多租户

3
我正在构建一个多租户应用,使用子域名来区分用户。 例如:.myapp.com
我也想为每个租户提供自己的数据库。
如何检测子域名并动态设置数据库?
此外,下面的代码来自官方文档,展示了我们如何在设置路由时获取子域名。但是如何将子域名值传递给控制器函数?
Route::group(array('domain' => '{account}.myapp.com'), function()
{

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

});
1个回答

2

最好的方法是在应用于路由组的before过滤器中实现。

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

这个 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”。
这应该会给您一些想法。请注意,这段代码没有经过测试。
此外,控制器上的每个方法都将接收域作为第一个参数。因此,请确保如果您需要其他参数,则进行调整。

在您的代码的第二部分中,$route->getHost(); 返回了字符串 "{account}.myapp.com" 而不是子域名的值。我可能做错了什么? - wyred
啊,你用$request->getHost()可能会更顺利些。 - Jason Lewis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接