Laravel使用compact传递多变量报错$book未定义,求正确传参方式
问题:Laravel视图传递多变量报错"undefined variable $book"
相关代码
HomeController.php
public function profilePage(){ $data = User::all(); $book = Library::all(); return view('page.profile' , compact(array('data', 'book'))); }
profile.blade.php
@include('layouts.sidebar') . . . @foreach($book as $Library) <tr> <td>{{$Library->book}}</td> <td>{{$Library->name}}</td> <td>{{$Library->author}}</td> <td>{{$Library->price}}</td> </tr> @endforeach
sidebar.blade.php
<div class="info"> <a href="{{ url ('profile' , $data -> first())}}" class="d-block">{{Auth::user() -> name }}</a> </div>
错误信息
Illuminate\Foundation\Bootstrap\HandleExceptions: 176 handleError
错误对应编译后的代码行:addLoop($currentLoopData); foreach($currentLoopData as $Library): $env->incrementLoopIndices(); $loop = $env->getLastLoop(); ?>
解答
你用compact()传递多变量的方式本身是正确的,报错的原因可以从这几个方向排查:
- compact写法冗余但不影响功能:
compact()支持直接传入字符串参数,不用包裹成数组,规范写法是compact('data', 'book'),但这不是报错的原因。 - 存在其他渲染该视图的路径:检查项目中是否有其他路由或控制器方法也在渲染
page.profile视图,但没有传递$book变量,这是最常见的触发原因。 - 视图缓存问题:Laravel会编译blade视图,旧缓存可能导致变量识别异常,执行以下命令清除缓存:
php artisan view:clear - 检查foreach代码的作用域:确认
profile.blade.php中的foreach代码块没有被条件语句(如@if)包裹导致变量未进入作用域,或者位置错误。
另外,Library::all()即使返回空集合,$book变量依然存在(为空集合),不会报"undefined variable",所以不用考虑查询为空的情况。
内容的提问来源于stack exchange,提问作者Muhammad Zarith
相关产品推荐
相关产品推荐

