我刚开始学习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');
});
});
有人可以建议如何避免这种重复吗?
答案 0 :(得分:4)
您可以创建一个名为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 :(得分:3)
那就是{domain}.example.app
需要.
之前的example.app
。
您可以移除.
并为domain
参数添加约束,使其最多只有.
所以代码看起来像
Route::group(['domain' => '{domain}example.app'], function($group) {
Route::get('/', function ($domain) {
//code
}) ;
// more routes
foreach($group->getRoutes() as $route){
$route->where('domain', '[a-z]+\.{0,1}');
}
});
P.S。 :我不知道我的正则表达式是否正确。
答案 2 :(得分: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);
}
答案 3 :(得分:2)
要在路由功能中使用domain参数,您需要像这样传递它:
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
答案 4 :(得分:1)
您的选项是路由重复或没有子域的HTTP请求的服务器级重定向。
简单的选择就是将example.app
转发给www.example.app
。
答案 5 :(得分:1)
Route::group(['domain' => '{domain}.example.app'], function() {
});
Route::group(['domain' => 'example.app'], function() {
});
这种模式很好但是如果你想使用不同的语言添加本地化文件