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

Laravel 8 在父Blade视图中引入子Blade时提示$all_items变量未定义

问题根源

你单独访问/items路由时,请求由MenuCmpItemsController@show处理,会给items.blade.php传递$all_items变量。但你在父视图auth.blade.php里用@include('items')引入子视图时,子视图的变量依赖于父视图对应路由的控制器传递的参数,如果父视图对应的控制器(比如你访问/home路由时的HomeController@index)没有传递$all_items变量,子视图自然会报未定义错误。

另外你代码里存在一个隐藏bug:控制器查询时选的是room_number字段,但子视图里输出的是$item->cmp_name,两者字段名不统一,后续即便变量传递正确也会报错,需要先修正保持字段一致。


解决方案

方案1:父视图控制器手动传参

如果你的侧边菜单只在少数页面用到,可以直接在对应父视图的控制器方法里查询数据并传参,比如修改HomeController的index方法:

use DB;

public function index()
{
    $all_items = DB::table('tbClassrooms')->select("room_number")->get();
    return view('home', compact('all_items'));
}

方案2:使用视图合成器(全局菜单场景推荐)

如果侧边菜单是全局公共组件,多个页面都会用到,推荐用Laravel的视图合成器实现自动绑定变量,不用每个控制器都重复写查询逻辑:

  1. 在app/Providers/AppServiceProvider.php的boot方法里添加代码:
use Illuminate\Support\Facades\View;
use DB;

public function boot()
{
    // 给items视图自动绑定$all_items变量
    View::composer('items', function ($view) {
        $all_items = DB::table('tbClassrooms')->select("room_number")->get();
        $view->with('all_items', $all_items);
    });
}
  1. 修改完成后,只要有地方引入items.blade.php,Laravel会自动注入$all_items变量,不需要每个控制器单独传参。

方案3:引入子视图时手动传参(仅临时调试用)

如果只是临时在个别父视图里测试,也可以在@include的时候手动传参:

@include('items', ['all_items' => DB::table('tbClassrooms')->select("room_number")->get()])

不推荐常规场景使用,会把业务逻辑耦合到视图层


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 23:54:04