Laravel 5,子域路由,带可选参数
Posted
技术标签:
【中文标题】Laravel 5,子域路由,带可选参数【英文标题】:Laravel 5, Sub-Domain routing, with optional parameter 【发布时间】:2015-11-17 05:50:40 【问题描述】:我刚开始学习 Laravel 5 并尝试创建多语言网站,并希望为该语言使用不同的域,因此 en.example.app 指向英语版本,es.example.app 指向西班牙语等等。我使用路由组,下面是我的代码。
Route::group(['domain' => 'domain.example.app'], function()
Route::get('/', function ()
return view('index');
);
Route::get('test', function()
return view('index');
);
);
它适用于除 example.app 之外的所有域。不幸的是,可选参数 domain? 不适用于子域,我不想像这样复制路由。
Route::get('/', function ()
return view('index');
);
Route::get('test', function()
return view('index');
);
Route::group(['domain' => 'domain.example.app'], function()
Route::get('/', function ()
return view('index');
);
Route::get('test', function()
return view('index');
);
);
有人可以建议如何避免这种重复吗?
【问题讨论】:
如果用户访问 example.app 他会得到什么语言的英文版或具有不同显示的自定义网站 【参考方案1】:这是因为domain.example.app
需要.
在example.app
之前。
您可以删除.
并为domain
参数添加约束,使其最多具有1 个.
所以代码看起来像
Route::group(['domain' => 'domainexample.app'], function($group)
Route::get('/', function ($domain)
//code
) ;
// more routes
foreach($group->getRoutes() as $route)
$route->where('domain', '[a-z]+\.0,1');
);
附: : 我不知道我的正则表达式是否正确。
【讨论】:
【参考方案2】:您可以创建一个名为 app-routes.php
的文件,其中包含您的所有路线,然后在您的实际 routes.php
文件中
Route::group(['domain' => 'domain.example.app'], function()
include('app-routes.php');
);
Route::group(['domain' => 'example.app'], function()
include('app-routes.php');
);
【讨论】:
很好 1,但你试过了吗?如何将域设置为某个常量? 我试过了,但我无法从 example.app 正确链接到 subdomain.example.app... 对此有什么想法吗? @j-戴维斯。我试过这个 URL::route('home', array('subdomain' => 'johndoe'))【参考方案3】:一个 MiddleWare 帮助了我。
Route::group(array('middleware' => 'resolve_domain'), function ()
Route::get('/', 'WhitePapersController@getHomepage');
);
而在 MiddleWare -
public function handle($request, Closure $next)
$params = explode('.', $request->getHost());
$sub_domains = config('admin_configs.editions'); // Predefined sub-domain
$edition = false;
if(!empty($params[0]) && in_array($params[0], $sub_domains, true))
$edition = $params[0];
define('DOMAIN_EDITION', $edition); // Set constant to be used.
return $next($request);
【讨论】:
【参考方案4】:对于没有子域的 HTTP 请求,您的选择是路由复制或服务器级重定向。
简单的选择是将example.app
转发到www.example.app
。
【讨论】:
【参考方案5】:Route::group(['domain' => 'domain.example.app'], function()
);
Route::group(['domain' => 'example.app'], function()
);
这个模式很好,但是如果你想使用不同的语言添加本地化文件
【讨论】:
【参考方案6】:要在你的路由函数中使用域参数,你需要像这样传递它:
Route::group(['domain' => 'domain.example.app'], function()
Route::get('/', function ($domain)
// do something
);
);
这里的文档中有介绍 - http://laravel.com/docs/5.1/routing#route-group-sub-domain-routing
【讨论】:
这不是回答关于如何接受没有子域的路由的问题以上是关于Laravel 5,子域路由,带可选参数的主要内容,如果未能解决你的问题,请参考以下文章