Laravel路由组用于多个带通配符的域,如何处理域后缀?

时间:2014-12-28 15:52:41

标签: laravel laravel-4 laravel-routing

我有3个域,在我的本地服务器上采用以下格式:

  • mydomainfirst.local
  • mydomainsecond.local
  • mydomainthird.local

在我的routes.php文件中,我有以下内容:

Route::group(array('domain' => '{domain}.{suffix}'), function() {

    Route::get('/', 'Primary@initialize');

});

我的想法是在控制器中取$domain变量并从中提取第一个/第二个/第三个部分,这样可以正常工作。但是,现在我的站点在线,此路由文件不再有效,并抛出一个Http-not-found异常。过了一会儿,我发现问题在于域名现在采用格式mydomainfirst.co.uk。因为域后缀现在有2个部分,所以我需要这样做:

Route::group(array('domain' => '{domain}.{a}.{b}'), function() {

    Route::get('/', 'Primary@initialize');

});

让它发挥作用。这是愚蠢的。我怎么能告诉它只接受任何后缀?我可以使用“任何”通配符吗?

我尝试了一些像this answer这样的东西,但它不适用于路线组。

编辑:似乎Enhanced Router包至少可以让我在路由组中添加where子句,但它是否解决了如何设置的问题一个匹配不确定数量的段的通配符?我需要这样的东西:

{domain}.{anything}

这两者都匹配:

mydomainfirst。本地 mydomainfirst。 co <​​/ strong>。英国

1 个答案:

答案 0 :(得分:2)

好的,我先说this package的代码实际上看起来不错,应该可行。即使您无法通过安装来运行它,您也可以获取文件并将代码与您自己的服务提供商等一起使用。

但也有一种快速而肮脏的解决方案。 (实际上这个包非常相似,但看起来好多了;))

首先,您可以通过以下方式进行操作:

Route::group(array('domain' => '{domain}.{tld}'), function(){
    Route::get('/', 'Primary@initialize')->where('tld', '.*');
});

因此路由组的where条件实际上是在单个路径上设置的。

当然,您不希望为该组中的每个路径执行此操作,因此您可以使用简单的foreach循环:

Route::group(array('domain' => '{domain}.{tld}'), function($group){

    Route::get('/', 'Primary@initialize');

    foreach($group->getRoutes() as $route){
        $route->where('tld', '.*');
    }
});

注意:循环需要来到所有路线之后。否则他们将不会注册,因此不会返回getRoutes()