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
相关产品推荐
相关产品推荐

