【问题标题】:Multi-tenant in Laravel4Laravel4 中的多租户
【发布时间】:2013-05-28 14:30:03
【问题描述】:

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

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

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

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

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

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

});

【问题讨论】:

    标签: laravel multi-tenant laravel-4


    【解决方案1】:

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

    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

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

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

    【讨论】:

    • 在代码的第二部分,$route->getHost();返回字符串“{account}.myapp.com”而不是子域的值。我哪里做错了?
    • 啊,$request->getHost() 的运气可能会更好。
    猜你喜欢
    • 2020-11-27
    • 2018-05-07
    • 1970-01-01
    • 2021-02-15
    • 2018-03-28
    • 2021-02-15
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多