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

Laravel控制器中如何在不同方法间传递$type变量

问题:Laravel跨页面传递$type变量到schoolSelection方法

我试图创建一个表单选择字段,展示指定类型的所有学校。原本单页实现的Laravel代码功能正常,现需拆分到两个页面,请问如何将storeType方法中的$type变量正确传递到schoolSelection方法中?

原控制器代码

public function schoolSelection(School $school,$type)
{
    $schools=$school->where('type','=',$type)->get();
    return view('auth.schoolSelection',compact('schools'));
}

public function storeType(Request $request, School $school)
{
    $data=$request->all();
    $type=$data['schoolType'];

    return redirect()->route('schoolSelection',compact('type'));
}

原路由配置

Route::get('schoolSelection/type',[RegisteredUserController::class,'schoolType'])->name('schoolType');

Route::get('schoolSelection/school',[RegisteredUserController::class,'schoolSelection'])->name('schoolSelection');

Route::post('schoolSelection/type',[RegisteredUserController::class,'storeType'])->name('type.store');

Route::post('schoolSelection/school',[RegisteredUserController::class,'schoolSelection'])->name('schoolSelection.store');

解决方案

问题核心是路由未定义参数接收$type,同时控制器方法的参数绑定和重定向逻辑需要调整,具体步骤如下:

1. 修正路由配置

修改schoolSelection的GET路由,添加{type}参数,让Laravel能从URL中捕获该值并传递到控制器方法:

Route::get('schoolSelection/type',[RegisteredUserController::class,'schoolType'])->name('schoolType');

// 添加{type}参数,用于接收传递的类型值
Route::get('schoolSelection/school/{type}',[RegisteredUserController::class,'schoolSelection'])->name('schoolSelection');

Route::post('schoolSelection/type',[RegisteredUserController::class,'storeType'])->name('type.store');

Route::post('schoolSelection/school',[RegisteredUserController::class,'schoolSelection'])->name('schoolSelection.store');

2. 调整storeType方法

简化参数获取方式,确保重定向时正确传递type参数到路由:

public function storeType(Request $request)
{
    // 用input()替代all(),更安全地获取指定字段
    $type = $request->input('schoolType');

    // 明确传递路由参数,避免歧义
    return redirect()->route('schoolSelection', ['type' => $type]);
}

注:此处无需注入School模型,因为方法中未使用该实例。

3. 优化schoolSelection方法

直接通过模型静态方法查询,无需注入School实例,同时可添加类型验证避免无效查询:

public function schoolSelection($type)
{
    // 可选:验证type是否为合法值,替换为你的实际合法类型列表
    $validTypes = ['primary', 'middle', 'high'];
    if (!in_array($type, $validTypes)) {
        abort(404, '无效的学校类型');
    }

    // 简化where条件写法,效果与原代码一致
    $schools = School::where('type', $type)->get();
    return view('auth.schoolSelection', compact('schools'));
}

内容的提问来源于stack exchange,提问作者Jac Phillipps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:45:52