2014-10-05 96 views
1

我想給在我的數據庫,而不是mysite.com/profile/1每個用戶的唯一URL,例如:Laravel優先路由

mysite.com/my-cool-user --> [email protected] 
mysite.com/my-other-user --> [email protected] 

但是如果它失敗(沒有這樣的entery如my-cool-user),它會繼續檢查爲其他路線。

這可能嗎?

回答

0

是的,它會失敗,你可以使用路由參數。

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

+0

但是,如果我先把這個規則,不會使所有其他規則,我沒用?例如我有一個靜態路由/關於頁面... – Broshi 2014-10-05 09:10:23

+0

明白了!只需放置'Route :: get('/ {username}','userController @ show');'在routes.php結尾,它的工作原理;-)謝謝! – Broshi 2014-10-05 09:15:56

+0

是的,它會從數據庫中尋找關於頁面的用戶,如果它存在的話,它會給你一個用戶,如果它不會失敗的話。您可以將此路線放置在其他路線下方。 – 2014-10-05 09:16:04

0

我不知道該怎麼做徹底解決它,但如果你有基於數據庫只有一個路由,您可以創建這樣的綁定規則:

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。但是,當你有許多基於數據庫的路由時,它仍然不能解決問題,並且它們都具有相同的模式而沒有任何前綴。