2017-08-23 40 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 –