我想給在我的數據庫,而不是mysite.com/profile/1
每個用戶的唯一URL,例如:Laravel優先路由
mysite.com/my-cool-user --> [email protected]
mysite.com/my-other-user --> [email protected]
但是如果它失敗(沒有這樣的entery如my-cool-user
),它會繼續檢查爲其他路線。
這可能嗎?
我想給在我的數據庫,而不是mysite.com/profile/1
每個用戶的唯一URL,例如:Laravel優先路由
mysite.com/my-cool-user --> [email protected]
mysite.com/my-other-user --> [email protected]
但是如果它失敗(沒有這樣的entery如my-cool-user
),它會繼續檢查爲其他路線。
這可能嗎?
是的,它會失敗,你可以使用路由參數。
Route::get('/{user-name}','[email protected]');
然後在您的控制器方法中爲方法添加一個參數。
public function userController($userName){
// find the user by new username
User::where('username',$userName)->first();
}
{user-name}可以是任何用戶名,如果名稱與數據庫匹配,您將獲得用戶配置文件。
在Laravel中路由首先在Routes.php中存在的語句將首先在低於該特定語句的其他語句之前處理。所以如果你有兩個相同的URL,第一個將會被使用。
Docs Routing Parameters。
我不知道該怎麼做徹底解決它,但如果你有基於數據庫只有一個路由,您可以創建這樣的綁定規則:
Route::bind('username', function ($value, $route) {
return User::where('name', $value)->first();
});
現在創建以下航線在所有路由結束:
Route::get('/{username}', ['uses' => '[email protected]']);
,並定義顯示功能:
public function test($username = null) {
var_dump($username);
}
在上面,如果$username
爲空或顯示404頁面,您可以重定向到主URL。但是,當你有許多基於數據庫的路由時,它仍然不能解決問題,並且它們都具有相同的模式而沒有任何前綴。
但是,如果我先把這個規則,不會使所有其他規則,我沒用?例如我有一個靜態路由/關於頁面... – Broshi 2014-10-05 09:10:23
明白了!只需放置'Route :: get('/ {username}','userController @ show');'在routes.php結尾,它的工作原理;-)謝謝! – Broshi 2014-10-05 09:15:56
是的,它會從數據庫中尋找關於頁面的用戶,如果它存在的話,它會給你一個用戶,如果它不會失敗的話。您可以將此路線放置在其他路線下方。 – 2014-10-05 09:16:04