13

我正在构建一个子域指向用户的应用程序。如何在路由之外的其他地方获取地址的子域部分?

Route::group(array('domain' => '{subdomain}.project.dev'), function() {

    Route::get('foo', function($subdomain) {
        // Here I can access $subdomain
    });

    // How can I get $subdomain here?

});

不过,我已经建立了一个混乱的解决方法:

Route::bind('subdomain', function($subdomain) {

    // Use IoC to store the variable for use anywhere
    App::bindIf('subdomain', function($app) use($subdomain) {
        return $subdomain;
    });

    // We are technically replacing the subdomain-variable
    // However, we don't need to change it
    return $subdomain;

});

我想在路由之外使用变量的原因是基于该变量建立数据库连接。

4

5 回答 5

14

在提出这个问题后不久,Laravel 实现了一种在路由代码中获取子域的新方法。它可以这样使用:

Route::group(array('domain' => '{subdomain}.project.dev'), function() {

    Route::get('foo', function($subdomain) {
        // Here I can access $subdomain
    });

    $subdomain = Route::input('subdomain');

});

请参阅文档中的“访问路由参数值” 。

于 2014-11-25T18:59:22.433 回答
10

$subdomain在实际Route回调中注入,它在group闭包内未定义,因为Request尚未解析。

我不明白为什么您需要在组关闭中使用它,在实际Route回调之外。

如果您想要Request在解析后随处可用,您可以设置一个后过滤器来存储该$subdomain值:

Config::set('request.subdomain', Route::getCurrentRoute()->getParameter('subdomain'));

更新:应用组过滤器来设置数据库连接。

Route::filter('set_subdomain_db', function($route, $request)
{
    //set your $db here based on $route or $request information.
    //set it to a config for example, so it si available in all
    //the routes this filter is applied to
    Config::set('request.subdomain', 'subdomain_here');
    Config::set('request.db', 'db_conn_here');
});

Route::group(array(
        'domain' => '{subdomain}.project.dev',
        'before' => 'set_subdomain_db'
    ), function() {

    Route::get('foo', function() {
        Config::get('request.subdomain');
    });

    Route::get('bar', function() {
        Config::get('request.subdomain');
        Config::get('request.db');
    });
});
于 2013-10-05T19:33:58.453 回答
6

以上不适用于 Laravel 5.4 或 5.6。请测试这个:

$subdomain = array_first(explode('.', request()->getHost()));
于 2017-05-12T22:06:58.450 回答
2

宏方式:

Request::macro('subdomain', function () {
    return current(explode('.', $this->getHost()));
});

现在你可以使用它了:

$request->subdomain();
于 2020-04-21T13:46:06.037 回答
0

在路由调用中

$route = Route::getCurrentRoute();

现在您应该可以访问该路线的所有内容了。IE

$route = Route::getCurrentRoute();
$subdomain = $route->getParameter('subdomain');
于 2013-09-25T13:30:15.367 回答