我想给在我的数据库,而不是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