【问题标题】:Laravel route acts craizyLaravel 路线表现得很疯狂
【发布时间】:2014-04-01 06:35:03
【问题描述】:

我有这个http://laravel.io/bin/jaPB

问题是当我去: domain.com -> 它服务于主页(就可以了) domain.com/foo -> 它提供一个子页面(还可以

但是当我从其中一个转到: domain.com/en -> 它给出了一个错误(not ok

但是点击刷新后就ok了。

所以,当我在 domain.com/en 上时,刷新后第一次出现错误 ok 刷新后的第一次错误,如 domain.com/en/contact 之类的子页面 ok

我会指出错误是第一次尝试转到 PublicPageController@subpage 但是当我去 domain.com/en 时这不应该发生,它应该需要去 PublicPageController@homepage

有什么想法吗? 谢谢大家。

【问题讨论】:

    标签: laravel laravel-routing


    【解决方案1】:

    我的猜测是查看您设置基于语言环境的路线的方式,Session::get('urilang) 在您第一次访问时未设置,因此出现错误,并且仅在您去过第一页。

    现在,我还没有处理多语言网站,但据我所知,您的做法并不正确。而是将 lang 键视为 URI 参数,并使用过滤器来验证并为路由设置它。有点像下面的代码:

    // Main and subpage - not default language
    Route::group(array('prefix' => '{lang}', 'before' => 'detectLanguage'), function () {
        Route::get('', 'PublicPage@homepage');
        Route::get('{slug}', 'PublicPage@subpage');
    });
    
    // Main and subpage - default language
    Route::group(array('before' => 'setDefaultLanguage'), function () {
        Route::get('/', 'PublicPage@homepage');
        Route::get('/{slug}', 'PublicPage@subpage');
    });
    
    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}/,这样你就可以减少路由问题。

    【讨论】:

    • 感谢您的帮助,您的代码看起来很酷,不过我只有一个问题。除了 domain.com/en/foo 之外的一切都有效,因为 PublicPageController 认为 slug 是“en”。任何想法?哦,我要稍微编辑一下代码,因为有一些拼写错误
    • 解决了,但它真的不是那么干净,我同意你的一切,谢谢你的帮助,真的拯救了我的一天。
    • 为编辑干杯,我想我有点赶时间了,抱歉。关于路线冲突的好问题。老实说,我不确定解决此问题的确切方法(尽管据我了解,在与相同 URI 匹配的另一条路由之后注册的路由将覆盖它,因此您可以考虑在这里颠倒顺序,但我认为这只会给你带来问题)。所以是的,这就是为什么我建议(在答案的末尾)不要使用双路由系统 - 获得一个系统并坚持使用它,因为它让事情变得不那么疯狂。
    • 啊酷,没问题。很高兴帮助您找到自己的解决方案:)
    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多