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

时间:2017-11-01 00:39:31

标签: laravel laravel-5 laravel-routing laravel-5.5

是否可以创建一个隐式路由,如果找不到该东西,则创建该路径?我正在使用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的端点,它会创建一个与Player身份1相关的拇指。但是,我想提供一个像这样的字符串而不是id号:

..../api/thumb/PLAYER_NAME

..../api/thumb/Blagoh的例子,那么我的终点应首先找到一个玩家是否存在名称" Blagoh",如果它没有,那么它应该创建它。我无法想出这个。

1 个答案:

答案 0 :(得分:1)

你应该做的是添加boot RouteServiceProvider这样的方法:

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

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

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