我正在构建一个多租户应用,使用子域来分隔用户。 例如.myapp.com
我想给每个租户自己的数据库。
如何检测子域并动态设置数据库?
此外,下面的代码来自官方文档,并向我们展示了在设置路由时如何获取子域名。但是我们如何将子域值传递给控制器函数?
Route::group(array('domain' => '{account}.myapp.com'), function()
{
Route::get('user/{id}', function($account, $id)
{
//
});
});
答案 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
。
这应该会给你一些想法。请注意,此代码均未经过测试。
此外,控制器上的每个方法都将接收域作为第一个参数。因此,如果您期待其他参数,请务必进行调整。