Php Laravel 5使用唯一参数进行布线
我目前正在使用带有参数Php Laravel 5使用唯一参数进行布线,php,laravel,laravel-5,Php,Laravel,Laravel 5,我目前正在使用带有参数name的路由来查询我的应用程序中用户的配置文件 例如:/members/john将显示john的个人资料 你看问题出在这里,如果有两个约翰,那就成问题了 我知道我可以这样做/members/id,因为id是唯一的,但我希望url与用户名(而不是随机数)保持一致 所以我的问题是,是否有一种方法可以使用id使其唯一,但在url中显示名称 我的路线: Route::get('/members/{name}', 'UserController@usersProfile'); M
name
的路由来查询我的应用程序中用户的配置文件
例如:/members/john
将显示john的个人资料
你看问题出在这里,如果有两个约翰,那就成问题了
我知道我可以这样做/members/id
,因为id是唯一的,但我希望url与用户名(而不是随机数)保持一致
所以我的问题是,是否有一种方法可以使用id使其唯一,但在url中显示名称
我的路线:
Route::get('/members/{name}', 'UserController@usersProfile');
My usersProfile方法:
/**
* Returns a users profile.
*
* @param string $name
*
* @return \Illuminate\Http\Response
*/
public function usersProfile($name)
{
$profile = $this->userService->getProfile($name);
if ($profile == null) {
return redirect('members')->with('status', 'Whoops, looks like that member does not exist (yet).');
}
return view('members/profile', ['profile' => $profile]);
}
您可以使用一些软件包来替换您的型号名称: 这些软件包会自动为您执行这些操作 如果您同名,则会发生以下情况:
http://example.com/post/my-dinner-with-andre-francois
http://example.com/post/my-dinner-with-andre-francois-1
http://example.com/post/my-dinner-with-andre-francois-2
只是在生产中,我对范围有一些问题。。。
在模型上应用全局作用域时,它可能会为该模型创建重复的slug。。。您可以通过将此项添加到模型中来修复此问题:
public function scopeFindSimilarSlugs(Builder $query, Model $model, $attribute, $config, $slug)
{
$separator = $config['separator'];
return $query->withoutGlobalScopes()->where(function (Builder $q) use ($attribute, $slug, $separator) {
$q->where($attribute, '=', $slug)
->orWhere($attribute, 'LIKE', $slug . $separator . '%');
});
}
您应该向用户表中添加另一个名为“slug”或“username”的列,并将该列映射到路由中 在您的用户模型中,创建一个静态函数来生成带有数字的唯一slug,并将其保存在新列中,以向用户提供公共/私有配置文件URL 以下示例将在100个同名用户之后停止返回slug/username
public static function getUniqueSlug($name) {
$original_slug = getSlug($name); // Default getter to get value in model
$slug = str_slug($original_slug); //Convert a string into url friendly string with hyphens
while(true) {
$count = User::where('slug', $slug)->count();
if($count > 0) {
$slug = $original_slug."-".rand(1,99);
} else {
return $slug;
}
}
}
为每个用户创建一个唯一的用户名,并在中使用该值route@MKhalidJunaid谢谢你的回复,但我不想使用唯一的用户名。这也取决于想法。。。。是否有人真的要输入一个URL。。。如果您这样认为,那么这个命名内容很重要,如果不这样认为,那么它就不重要了。
{id}/{name}
现在不会发生冲突,名称仍然在URL中。您也不想使用id,那么您如何确定用户?在迁移users表时,确保name
字段是唯一的$table->string('name')->unique();代码>谢谢!很酷的软件包,正是我所需要的。:)