Laravel4中的多租户

时间:2013-06-02 04:33:47

标签: laravel multi-tenant laravel-4

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

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

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

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

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

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

});

1 个答案:

答案 0 :(得分:2)

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

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

此前过滤器会获得$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

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

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