【发布时间】:2017-03-18 06:43:28
【问题描述】:
我决定在我的所有路由前加上一个 $locale-variable。这是从谷歌搜索找到的代码:
$locale = Request::segment(1);
if (in_array($locale, Config::get('app.available_locales'))) {
App::setLocale($locale);
} else {
$locale = null;
}
Route::group(array('prefix' => $locale), function() {
//All my routes
});
现在,我想动态生成 URL:s 以在语言环境之间跳转。我想要一种生成当前 url 或路由的方法,但替换 $locale 参数。你应该可以写出类似这个伪代码的东西:
route(Route::Current(), [$locale => 'foo'])
问题:
我想使用我当前的 URL 并替换其中的一个参数。我该怎么做?
更新 1:
给我的路线一个名字,我可以这样做:
route('index', 'foo') //Gives mywebsite.com?foo
但是,这不会产生想要的结果,mywebsite.com/foo。而是生成 mywebsite.com?foo。我的猜测是该路由不理解该路由是嵌套的并以片段为前缀,因此它将我的参数视为参数。指定它是我要更改的语言环境无济于事:
route('index', ['locale' => 'foo']) //Gives mywebsite.com?locale=foo
更新 2:
将前缀改为:
Route::group(array('prefix' => '{locale?}'), function() {
使 route() 工作:
route('index', ['locale' => 'foo']) //Gives mywebsite.com/foo
然而,它确实破坏了组内的一些 url:s,因为其中一些以变量开头。路由组内的以下路由停止工作:
Route::get('/{id}', 'FooController@showFoo');
由于 routes.php 将 url mywebsite.com/foo 解释为 'foo' 现在是语言。如果有某种方法可以在 routes.php 中为 locale 设置默认值,以便您可以将其写为 {route} 而不是 {route?} 并在丢失时将其重定向到默认语言环境,那么问题将得到解决.
更新 3:
朝着拥有 'prefix' => '{locale?}' 的方向发展反而会导致太多的子问题不值得研究。问题又回到从当前 url 生成 url,但在 url 中插入语言。我目前正在考虑仅使用正则表达式替换来执行此操作,因为它是最直接的解决方案。
【问题讨论】:
-
您想
prefix all [my] routes,但您也想将其设为可选?那么你真正想要的是什么?我认为最好在您的路线中添加 ALL 或 NONE 前缀。 -
我想要一个工作的语言环境系统,其 url 中的语言环境。如果 url/request 中缺少区域设置,则应使用默认区域设置。
-
我认为这并不容易,因为 Laravel 不知道什么时候应该将第一个参数解释为语言环境,什么时候不应该。
-
如果第一个参数匹配来自 Config::get('app.available_locales') 的字符串,也许就像我在设置语言环境时所做的那样?
-
是的,这不可能吗?检查请求的第一段。如果匹配,万岁我们有一个语言环境。如果没有,请将默认语言环境插入请求并重定向。这可能对吧?