我有这个代码:
class BunnyUpdateRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'id' => ['required', 'min:1'],
'status' => ['required', Rule::enum(BunnyStatus::class)]
];
}
public function validationData(){
return array_merge($this->all(), [
'id' => $this->route()->parameter('bunny_id'),
'status' => $this->route()->parameter('status')
]);
}
}
class BunnyController extends Controller
{
public function update(BunnyUpdateRequest $bunnyUpdateRequest)
{
$fields = $bunnyUpdateRequest->validated();
$bunny = Bunny::findOrFail($fields['id']);
if ($bunny->status === BunnyStatus::Done)
return Response::json(null, 422);
$bunny->status = $fields['status'];
$bunny->save();
return Response::json(null, 200);
}
}
通常我会使用它$request->input
来获取经过验证的主体输入字段或查询参数。据我所知,在这种情况下验证会运行。至少我希望如此。如果我尝试以相同的方式获取,上面的代码会获取空的路径参数。这就是我使用数组的原因validated()
。我不喜欢这种方法,因为我觉得代码很丑。有没有办法将这些路径参数作为请求对象上的对象属性,就像主体输入字段和查询参数一样?有没有办法以某种方式通过请求模型绑定获取 Bunny 实例而不是 id?
我有一个解决方案:
validationData
我没有使用方法prepareForValidation
来合并路径参数。我将 移至findOrFail
请求。对于不存在的兔子,它也会以这种方式给出 404。首先,从传统的角度来看,您提供的答案很好,即您从然后
URL
验证(使用自定义)中获取了两个参数,如果不等于则Form Request
更新记录 。BunnyStatus
DONE
但是 Laravel 本身提供了一些内置功能,您可以用更少的代码行以及无需自定义来执行相同的操作
Form Request
。这就是我写这个答案的原因,它将提供另一种视角来做同样的事情并帮助你
404 error
自动管理。像这样更改您的路线定义。
上面我已经实现了
implicit model binding
,implicit enum binding
以及missing model/enum Behaviour
。这就是您不需要自定义的原因,form request
因为basic-validation
将在那里完成。然后在控制器中执行此操作。默认情况下,这将获取并注入模型
update()
的匹配模型实例作为枚举传递给在路由定义中完成的验证后的方法。Bunny
Bunny $bunny
BunnyStatus $status
URL
记得将这些类和其他所需的类导入到 Controller 类的顶部。
引文:-