Laravel中如何通过FormRequest优雅获取路径参数及实现模型绑定?
问题解答
1. 让路径参数可通过$request->input()或动态属性获取
你可以在BunnyUpdateRequest中重写prepareForValidation方法,把路由参数合并到请求的输入数据里,之后就能像获取请求体/查询参数一样用input()或者直接访问动态属性:
class BunnyUpdateRequest extends FormRequest { protected function prepareForValidation() { // 把路由参数合并到请求输入中 $this->merge([ 'id' => $this->route('bunny_id'), 'status' => $this->route('status'), ]); } public function authorize(): bool { return true; } public function rules(): array { return [ 'id' => ['required', 'min:1'], 'status' => ['required', Rule::enum(BunnyStatus::class)] ]; } // 原有的validationData方法可以删除 }
之后在控制器里就能这样用:
public function update(BunnyUpdateRequest $bunnyUpdateRequest) { // 用input()获取 $id = $bunnyUpdateRequest->input('id'); $status = $bunnyUpdateRequest->input('status'); // 或者直接访问动态属性 $id = $bunnyUpdateRequest->id; $status = $bunnyUpdateRequest->status; // 后续业务逻辑不变... }
2. 通过模型绑定直接获取Bunny实例
完全可以,按以下步骤调整:
第一步:调整路由定义
确保路由参数使用模型的单数名称(比如bunny),Laravel会自动根据主键绑定对应模型实例:
// 示例路由(根据你的实际路由结构调整) Route::put('/bunnies/{bunny}/{status}', [BunnyController::class, 'update']);
如果你的路由参数必须用bunny_id,可以写成{bunny:id}来指定绑定的字段。
第二步:修改请求类
不需要再验证id,只保留status的验证规则,同时把路由参数status合并到请求输入:
class BunnyUpdateRequest extends FormRequest { protected function prepareForValidation() { $this->merge([ 'status' => $this->route('status'), ]); } public function authorize(): bool { return true; } public function rules(): array { return [ 'status' => ['required', Rule::enum(BunnyStatus::class)] ]; } }
第三步:调整控制器方法
直接在参数中类型提示Bunny模型,Laravel会自动完成findOrFail的逻辑:
public function update(BunnyUpdateRequest $request, Bunny $bunny) { if ($bunny->status === BunnyStatus::Done) { return response()->json(null, 422); } $bunny->status = $request->input('status'); $bunny->save(); return response()->json(null, 200); }
这样就省去了手动查找模型的代码,逻辑更简洁。
内容的提问来源于stack exchange,提问作者inf3rno
相关产品推荐
相关产品推荐

