隐式路由,使用 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 1
的 Player
相关的缩略图。但是,我想提供一个像这样的字符串,而不是 ID 号:
..../api/thumb/PLAYER_NAME
..../api/thumb/Blagoh
的示例,然后我的端点应首先查找名称为 "Blagoh" 的玩家是否存在,如果不存在,则应创建它。我想不通这个。
你应该做的是在 RouteServiceProvider
的 boot
方法中添加如下内容:
Route::bind('player', function ($value) {
if ($player = \App\Player::find($value)) {
return $player;
}
return Player::create(['name' => $value]);
});
这称为显式绑定,您可以更新逻辑,如上所示。 Reference - Route model binding
是否可以创建一个隐式路由,如果找不到就创建一个东西?我正在使用 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 1
的 Player
相关的缩略图。但是,我想提供一个像这样的字符串,而不是 ID 号:
..../api/thumb/PLAYER_NAME
..../api/thumb/Blagoh
的示例,然后我的端点应首先查找名称为 "Blagoh" 的玩家是否存在,如果不存在,则应创建它。我想不通这个。
你应该做的是在 RouteServiceProvider
的 boot
方法中添加如下内容:
Route::bind('player', function ($value) {
if ($player = \App\Player::find($value)) {
return $player;
}
return Player::create(['name' => $value]);
});
这称为显式绑定,您可以更新逻辑,如上所示。 Reference - Route model binding