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

Yom*_*omY 9 subdomain dns routing laravel laravel-5

在laravel 5应用程序中,我试图在不知道域的情况下为子域创建路由.

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

这种路由工作,我得到了subTmain的getTest2()和没有子域调用的getTest1().

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

我试过了

array('domain' => 'subdomain.{domain}.{tld}')
Run Code Online (Sandbox Code Playgroud)

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

array('domain' => 'subdomain.{domain?}.{tld?}')
Run Code Online (Sandbox Code Playgroud)

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

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

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

jpc*_*ara 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
  });
});
Run Code Online (Sandbox Code Playgroud)