2017-08-23 39 views
1

我是i18n我的网站的路由,我想要一个包含语言短代码的url结构,我希望路由在没有短代码的情况下工作(默认为英语)Laravel/php函数变量错误交替

我想实现mysite.com/articles/1/some-post-title(默认为英语),然后 mysite.com/fr/articles/1/some-post-title(选择适当的语言,在这种情况下,法国)

我有两个途径一个没有语言环境变量,另一种没有局部变量。这两条路线都指向相同功能

在情况1

其中的语言环境变量不存在我的代码,而不是从所述$locale变量(其被认为是空)的路由分配的id值,则$title变量分配给$id使代码返回错误的结果。

Route::get('/articles/{id}/{title}', function($locale=null,$id=null, $title=null){ 
    return $locale.'<br>'.$id.'<br>'.$title; 
}); 

在案例2中

正确的顺序之后,因为所有这三个变量都存在

Route::get('/{locale}/articles/{id}/{title}',function($locale=null,$id=null, $title=null){ 
    return $locale.'<br>'.$id.'<br>'.$title; 
}); 

另一个担心

即使在情况下,两个代码将胡作非为如果我改变了变量的顺序,也许把局部放在最后,尽管我不确定php如何处理这个问题,但我不认为命令是因为这些变量具有唯一的名称。 我知道我可以将路线指向两种不同的功能作为可能的解决方案,但这只是重复代码。 在此先感谢您的帮助。

+0

我认为'null'是一个状态,而不是一个值。作为一种价值,它往往运输不好。 'foo.com // a' vs'foo.com/0/a'。不知道我完全明白这个问题,但基本上是发生了什么? – ficuscr

+0

@ficuscr在这种情况下,空值是在函数中分配的,而不是在路径的层次上。 –

+0

@ficuscr第一条路线是完全无效的区域设置变量,所以空值不会导致“//” –

回答

2

路线的顺序很重要。因此,要确保有效的行动应符合你可能会考虑加入routes constraints,例如:

Route::get('/{locale}/articles/{id}/{title}',function($locale=null,$id=null, $title=null){ 
    return $locale.'<br>'.$id.'<br>'.$title; 
})->where('id','\d+'); 

确保ID是真的数。

关于参数顺序,Laravel将按照它们出现的顺序匹配参数。

Route::get('/articles/{id}/{title}', function($locale=null,$id=null, $title=null){ 

id参数会去1变量($locale)和title参数会去第二:你有3个参数在你关闭,如果你有其中只有2在你的路线,所以这个片段无论变量($id)。网址中没有第三个参数,因此没有任何内容会被分配给标题。如果您的网址中有2个参数,则应在闭包中使用相同数量的参数,以使其按预期工作。

+0

我明白路线中变量的顺序很重要,为什么在函数中?添加您指定的约束不会改进行为。感谢您的回复至目前为止 –

+0

@F。ENoelNfebe我已经更新了我的回答并附加了额外的解释 –

+0

谢谢Marcin –