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

Laravel 8 如何将不同控制器的多个变量传递到同一个视图

问题根源
  • 同请求方式、同路径的路由在Laravel中遵循从上到下的匹配规则,你配置了两个GET /enroll路由,访问时只会触发排在前面的控制器方法,另一个方法永远不会执行,自然缺少对应变量。
  • 每次调用view()渲染视图时传递的变量仅在当前渲染周期有效,无法跨控制器方法自动合并。
常规场景解决方案

直接合并查询逻辑到同一个控制器方法,一次性传递所有需要的变量即可,无需拆分到两个控制器:

  1. 路由调整:删除原有两个重复的/enroll路由,仅保留一个
Route::get('/enroll', [EnrollmentController::class, 'index'])->name('enroll.form');

也可以直接复用现有控制器,不需要新建,比如直接在TimeController的loadTime方法中添加课程查询逻辑即可。

  1. 控制器代码示例
<?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:57:03