任何域上的 Laravel 5 子域路由
Posted
技术标签:
【中文标题】任何域上的 Laravel 5 子域路由【英文标题】:Laravel 5 subdomain routing on any domain 【发布时间】:2015-10-01 07:37:07 【问题描述】:在 laravel 5 应用程序中,我正在尝试为子域创建路由 不知道域。
Route::group(array('domain' => 'subdomain.domain.tld'), function()
Route::get('/', 'testController@getTest2');
);
Route::get('/', 'testController@getTest1');
这种路由有效,我得到 getTest2() 调用子域和 getTest1() 调用没有子域。
现在,我希望它与通配符域一起使用,但不向控制器发送参数, 因此开发环境中的应用程序可以在任何域上。 (我也考虑过使用 .env 来存储域,但是对于路由来说似乎太麻烦了)
我试过了
array('domain' => 'subdomain.domain.tld')
这需要控制器方法的参数。 我试过了
array('domain' => 'subdomain.domain?.tld?')
它不需要参数,但无论如何都会发送它们,所以我的实际路由参数会发生变化。
我也见过http://laravel-tricks.com/tricks/dynamic-subdomain-routing,但我不喜欢在过滤器中处理我的域的想法。
有没有其他方法可以让通配符域在处理路由组后被忽略?
【问题讨论】:
我对此也很感兴趣。我的 laravel 后端提供了一个 api,我对其进行了配置,以便该 api 在 api.domain 下可用,以及在不同子域下与 oauth 相关的其他一些东西。由于我正在使用宅基地进行本地开发,并且服务器显然将在另一个域上,我希望有一种方法可以不在我的应用程序中对域进行硬编码 在找到更好的解决方案之前,我已经直接在路由文件中添加了手动域检查,使用类似于用户 mazon 在这里回答的内容:***.com/a/12372310/2099306 【参考方案1】:我发现最好的方法是创建一个中间件,从您的路由中删除特定参数。例如,在您的情况下:
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
);
);
【讨论】:
有趣的方法。我喜欢它,并且可能会用它来操作路由中的参数。但是,它并不能解决问题。这样,“/”的路由功能对于所有子域仍然是相同的。这个想法是根据调用的子域指向不同的函数。 x.sub.tld > 函数 1,y.sub.tld > 函数 2。不过谢谢你的新想法。【参考方案2】:让你知道你可以做到
'domain' => 'subdomain.domain.tld'
这会将 a.domain.com 和 b.domain.com 路由到所有相同的路由/相同的控制器,您可以在该控制器内执行您的逻辑。
我会使用上面建议的中间件从请求中删除域和 tld,否则每个建模都必须看起来像。
public function myMethod($subdomain, $domain, $tld, $id)
假设您的路由需要 $id 或任何其他路由参数。
您可能感兴趣的另一件事是显式表单模型绑定。
【讨论】:
【参考方案3】:检查这可能有助于回答您的问题:
http://laravel.com/docs/5.1/routing#parameters-regular-expression-constraints
http://laravel.com/docs/5.1/routing#route-group-sub-domain-routing
【讨论】:
我已经阅读了文档,参数中的正则表达式会影响参数,但不会改变控制器获取它们的方式。以上是关于任何域上的 Laravel 5 子域路由的主要内容,如果未能解决你的问题,请参考以下文章