有没有办法设置可选的路线位置部分?

时间:2019-09-16 16:19:27

标签: laravel laravel-routing

首先,我不确定如何正确构造问题标题,可以随时对其进行编辑以正确表示问题。我会尽力解释我的意思。

我在我的应用上实现了本地化(教程的URL在这篇文章的底部),并且我创建了如下路线:

// Set language
Route::get('lang/{locale}', 'PagesController@lang');

它有效。但是仅在网址中只有一个“级别”的页面上:

example.com/first-level-在这些URL上更改语言可行 example.com/first-level/second-level-在这些页面上更改语言不起作用

起初,我认为问题出在url参数上,这是偶然的原因,我最初发现更改语言不起作用的页面是在url上,而该路由具有这样的参数

example.com/first-level/{id}

因此,我然后尝试重写将语言更改为此的路线(添加了可选参数)

// Set language
Route::get('lang/{optional?}/{locale}', 'PagesController@lang');

但这也不起作用

通过指向路线的锚标记更改语言

<a href="lang/en">English</
<a href="lang/rs">Serbian</a>

预期结果:能够从单击链接的任何页面更改语言。单击example.com/one/twoexample.com/one/{id}/two之类的页面上的链接应该可以正常工作。

实际结果:更改语言仅在example.comexample.com/one之类的页面上有效,而在example.com/one/twoexample.com/one/{id}/two上则无效。在这些页面上单击链接后,该应用程序将发送到这样的URL:分别为example.com/one/lang/enexample.com/one/{id}/lang/en

我按照本教程https://appdividend.com/2019/04/01/how-to-create-multilingual-website-using-laravel-localization/#Step_2_Creating_Translation_Files

在我的项目上实现了本地化

1 个答案:

答案 0 :(得分:1)

您可以简单地定义两条路线。

Route::get('lang/{locale}', 'PagesController@locale');
Route::get('lang/{optional}/{locale}', 'PagesController@lang');

然后使用您的控制器方法处理可选变量。

public function locale($locale)
{
    return $this->lang(null, $locale);
}

public function lang($optional, $locale)
{
    // ... your logic
}

对于链接问题,您需要使用绝对路径。

// relative path — https://yourdomain.com/current/path/lang/en
<a href="lang/en">English</a>
<a href="lang/rs">Serbian</a>

// absolute path — https://yourdomain.com/lang/en
<a href="/lang/en">English</a>
<a href="/lang/rs">Serbian</a>