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

Is there a way to set optional route location parts?

首先,我不确定如何正确构建问题标题,请随意编辑它以正确表示问题。我会尽力解释我的意思。

我在我的应用程序上实现了本地化(URL 教程在这个 post 的底部),我创建了如下路线:

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

并且有效。但仅限于 url:

中只有一个 "level" 的页面

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

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

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
}

至于你的link问题,你需要使用绝对路径。

// 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>