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的视图合成器实现自动绑定变量,不用每个控制器都重复写查询逻辑:
- 在
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); }); }
- 修改完成后,只要有地方引入
items.blade.php,Laravel会自动注入$all_items变量,不需要每个控制器单独传参。
方案3:引入子视图时手动传参(仅临时调试用)
如果只是临时在个别父视图里测试,也可以在@include的时候手动传参:
@include('items', ['all_items' => DB::table('tbClassrooms')->select("room_number")->get()])
不推荐常规场景使用,会把业务逻辑耦合到视图层
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

