Laravel 5在任何域上的子域路由

时间:2015-07-13 06:21:34

标签: laravel dns routing laravel-5 subdomain

在laravel 5应用程序中,我正在尝试为子域创建路由 不知道域名。

Route::group(array('domain' => 'subdomain.domain.tld'), function() {
    Route::get('/', 'testController@getTest2');
});
Route::get('/', 'testController@getTest1');

这种路由有效,我为子域调用getTest2(),没有子域调用getTest1()。

现在,我希望这可以使用通配符域,但不向控制器发送参数, 所以dev环境中的应用程序可以在任何域上。 (我也考虑使用.env存储域名,但这对于路由来说似乎太麻烦了)

我试过

array('domain' => 'subdomain.{domain}.{tld}')

这需要控制器方法的参数。 我试过了

array('domain' => 'subdomain.{domain?}.{tld?}')

这不需要参数,但无论如何都要发送它们,所以我的实际路线参数会被转移。

我也看过http://laravel-tricks.com/tricks/dynamic-subdomain-routing,但我不喜欢在过滤器中处理域名的想法。

有没有其他方法可以在处理路由组后忽略通配符域?

3 个答案:

答案 0 :(得分:6)

我发现这样做的最好方法是创建一个中间件,从您的路线中删除特定参数。例如,在您的情况下:

class Subdomain {
  public function handle($request, Closure $next) 
  {
    $route = $request->route();
    $domain = $route->parameter('domain');
    $tld = $route->parameter('tld');

    //do something with your params

    $route->forgetParameter('domain');
    $route->forgetParameter('tld');
    return $next($request);
  }
}

//inside your Kernel.php, make sure to register the middleware
protected $routeMiddleware = [
  'subdomain' => \App\Http\Middleware\Subdomain::class,
];

Route::group(['middleware' => 'subdomain', 'domain' => 'subdomain.{domain}.{tld}'], function () {
  Route::get('/', function () {
    dd(func_get_args()); //no args, because it was removed in the middleware
  });
});

答案 1 :(得分:1)

只是你知道你可以做到

'domain' => '{subdomain}.{domain}.{tld}' 

这会将a.domain.com和b.domain.com路由到所有相同的路由/相同的控制器,您可以在该控制器内部执行逻辑。

我会使用像上面的suggjested这样的中间件从请求中删除域和tld,否则每个建模都必须看起来像。

public function myMethod($subdomain, $domain, $tld, $id)

假设您的路线需要$ id或任何其他路线参数。

您可能感兴趣的另一件事是Explicit Form Model Binding。

答案 2 :(得分:-1)