Laravel 5,子域路由,带可选参数

时间:2015-08-23 21:10:29

标签: php laravel laravel-5 laravel-routing laravel-5.1

我刚开始学习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');
    });
});

有人可以建议如何避免这种重复吗?

6 个答案:

答案 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() {

}); 

这种模式很好但是如果你想使用不同的语言添加本地化文件