2014-10-05 99 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。但是,当你有许多基于数据库的路由时,它仍然不能解决问题,并且它们都具有相同的模式而没有任何前缀。