隐式路由,使用 firstOrCreate 而不是 findOrFail

Implicit route, with firstOrCreate instead of findOrFail

是否可以创建一个隐式路由,如果找不到就创建一个东西?我正在使用 Laravel 5.5.13.

例如这是我的隐含路线:

Route::post('thumbs/{player}', 'ThumbController@store');

在我的控制器中是这样的:

public function store(Request $request, Player $player)
{
    $thumb = new Thumb($request->all());
    $player->thumbs()->save($thumb);
    return response()->json($thumb, 201);
}

所以现在如果我转到 ..../api/thumb/1 的端点,它将创建一个与 ID 1Player 相关的缩略图。但是,我想提供一个像这样的字符串,而不是 ID 号:

..../api/thumb/PLAYER_NAME

..../api/thumb/Blagoh 的示例,然后我的端点应首先查找名称为 "Blagoh" 的玩家是否存在,如果不存在,则应创建它。我想不通这个。

你应该做的是在 RouteServiceProviderboot 方法中添加如下内容:

Route::bind('player', function ($value) {
   if ($player = \App\Player::find($value)) {
      return $player;
   }

   return Player::create(['name' => $value]);
});

这称为显式绑定,您可以更新逻辑,如上所示。 Reference - Route model binding