You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:55:05