2014-02-28 46 views
3

海兰我有这个http://laravel.io/bin/jaPBLaravel路线起craizy

的问题是,当我去: domain.com - >它所服务的主页(至极是确定) domain.com/foo - >它供应子页(还OK

但是当我从那些一去: domain.com/en - >它给出了一个错误(也不行

但点击刷新后确定。

所以,当我再次刷新后domain.com/en第一次错误很确定 同去刷新确定后,子页像domain.com/en/contact第一次错误

我想指出的是,错误说,它第一次尝试去PublicPageController @子页面 但这不应该发生,当我去的domain.com/en它应该需要去PublicPageController @首页

任何想法? 谢谢大家。

回答

2

我在这里看看你设置基于语言环境的路由的方式,因为Session::get('urilang)没有在你第一次访问时设置,因此错误,并且只有在你去过某个页面后才会设置第一。

现在,我还没有处理多语言网站,但据我所知,你这样做的方式不是正确的方式。相反,将lang键作为URI参数来考虑,并使用过滤器来验证并设置路由。东西有点像下面的代码:

// Main and subpage - not default language 
Route::group(array('prefix' => '{lang}', 'before' => 'detectLanguage'), function() { 
    Route::get('', '[email protected]'); 
    Route::get('{slug}', '[email protected]'); 
}); 

// Main and subpage - default language 
Route::group(array('before' => 'setDefaultLanguage'), function() { 
    Route::get('/', '[email protected]'); 
    Route::get('/{slug}', '[email protected]'); 
}); 

Route::filter('detectLanguage', function($route, $request, $response, $value){ 
    // hopefully we could do something here with our named route parameter "lang" - not really on sure the details though 

    // set default 
    $locale = 'hu'; 
    $lang = ''; 

    // The 'en' -> would come from db and if there is more i would of corse use in array 
    if (Request::segment(1) == 'en') 
    { 
     $lang = 'en'; 
     $locale = 'en'; 
    } 

    App::setLocale($locale); 
    Session::put('uriLang', $lang); 
    Session::put('locale', $locale); 
}); 


Route::filter('setDefaultLanguage', function($route, $request, $response, $value){ 
    App::setLocale('hu'); 
    Session::put('uriLang', ''); 
    Session::put('locale', 'hu'); 
}); 

我不知道你是否能在Route::group前缀使用段变量,但你肯定应该有一搏,因为它会是最有用的。

也就是说,我不建议设置模仿特定语言路线但没有语言段的默认语言路线。如果我是你,我会设置一个特殊的根路由,重定向到/{defaultlang}/,这样你的路由问题就会减少。

+1

感谢您的帮助,您的代码看起来非常酷,但我只有一个问题。除了domain.com/en/foo以外的所有内容都可以使用因为那里的PublicPageController认为slug是“en”。任何想法?哦,我要编辑代码,因为有一些错别字 –

+0

解决了它,但它并不是那么干净,我同意你的一切,谢谢你的帮助人,真的拯救了我的一天。 –

+1

为编辑而欢呼,我想我有点匆忙,一个出来,对不起。关于路线冲突的事情的好问题。如果我是诚实的,我不确定这个问题的确切方法(尽管据我了解,在另一条路线上注册的路线与相同的URI相匹配会覆盖它,所以你可以考虑在这里逆转订单,但我认为这会给你带来另一个问题)。所以,这就是为什么我建议(在答案的最后)没有双路由系统 - 获得一个系统并坚持下去,因为它使事情变得不那么疯狂了。 – alexrussell