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();谢谢!很酷的软件包,正是我所需要的。:)