Laravel 8 如何将不同控制器的多个变量传递到同一个视图
问题根源
- 同请求方式、同路径的路由在Laravel中遵循从上到下的匹配规则,你配置了两个
GET /enroll路由,访问时只会触发排在前面的控制器方法,另一个方法永远不会执行,自然缺少对应变量。 - 每次调用
view()渲染视图时传递的变量仅在当前渲染周期有效,无法跨控制器方法自动合并。
常规场景解决方案
直接合并查询逻辑到同一个控制器方法,一次性传递所有需要的变量即可,无需拆分到两个控制器:
- 路由调整:删除原有两个重复的
/enroll路由,仅保留一个
Route::get('/enroll', [EnrollmentController::class, 'index'])->name('enroll.form');
也可以直接复用现有控制器,不需要新建,比如直接在TimeController的loadTime方法中添加课程查询逻辑即可。
- 控制器代码示例
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; class EnrollmentController extends Controller { public function index() { $courseList = DB::table('courses')->get(); $timeList = DB::table('time')->get(); return view('admin.forms.enrollment', compact('courseList', 'timeList')); } }
多视图复用数据解决方案
如果多个页面都需要用到课程、时间列表数据,可以用Laravel视图合成器全局绑定,不需要每个控制器重复查询:
在app/Providers/AppServiceProvider.php的boot()方法中添加如下代码:
use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\DB; public function boot() { View::composer('admin.forms.enrollment', function ($view) { $view->with('courseList', DB::table('courses')->get()); $view->with('timeList', DB::table('time')->get()); }); }
绑定后只要渲染admin.forms.enrollment视图,就会自动注入两个变量,无需控制器传递。
视图代码修正
你当前的课程下拉框代码缺少@endforeach闭合标签,会触发语法错误,修正后代码:
<select name="course" id="course" class="form-control"> @foreach($courseList as $course) <option value="{{$course->vehicle_category}}">{{$course->course_type}}</option> @endforeach </select>
内容的提问来源于stack exchange,提问作者Kiran Shrestha
相关产品推荐
相关产品推荐

