在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,但我不喜欢在过滤器中处理域名的想法。
有没有其他方法可以在处理路由组后忽略通配符域?
答案 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)