Laravel-第一个段是可选的


Laravel - First segment to be optional

我对Laravel相当陌生,我希望我的网站是多语言的。我将所选语言slug存储在Session中.但是如何让我的网址显示选择的语言:

Route::get('/{lang?}/signup', array(
    'as' => 'signup',
    'uses' => 'UsersController@getSignup'
));

http://example.com/en/signup - 如果我得到带有 URL::segment(1( 的第一个段并将其传递给Session一切正常。使用我上面发布的Route,如果我打开第二个链接,我会得到 4oh4

所以基本上我想不出一种能让 http://example.com/en/signup 和 http://example.com/singup 都起作用的方法。

第一个链接应

更改用户语言,第二个链接应使用 Session 中存储的值来获取此语言的结果。

编辑:

我正在尝试制作类似 CMS 的东西,我在数据库的表中设置了一些键 - languages

id - (int( AI, name - (瓦尔查尔( - 语言

名称,prefix - (瓦尔查尔( - 语言前缀

另一个表格存储网站中某些部分的translationsid - (int(AI,key(例如signup_form_name(,value(例如。我的注册表格(

helpers.php中有这个功能:

function _t($key, $language = NULL)
{
    if(is_null($language))
        $language = Session::get('currLang');
    $string = DB::table('translations')
        ->where('key', $key)
        ->pluck('value');
    return (!is_null($string)) ? $string : $key;
}

它如何区分

en

signup

这只是两根弦。唯一的方法可能是击中

http://example.com//signup

而不是

http://example.com/signup 

因为这样你就是在明确地告诉Laravel你没有传递第一个路由参数。但这行不通,因为 Laravel 也不会理解它,Github 中有一个关于这个问题的问题。

所以这是您的选择之一:

Route::get('/signup/{lang?}' ...);

所以你可以把它打成

http://example.com/signup

http://example.com/signup/en
Route::get('/{lang?}/signup', array(
    'as' => 'signup',
    'uses' => 'UsersController@getSignup'
))->where('lang', '(en|br)');

这里的关键问题是您需要将 lang 硬编码到控制器中,但它应该可以工作......