Laravel项目触发ErrorException: Undefined variable $siswa报错求解决
问题原因
这个错误本质是siswa.blade.php模板渲染时,没有接收到后端传递的$siswa变量,大概率是以下两种情况导致:
- Laravel 8及以上版本路由配置写法不兼容,控制器方法未被正确触发,没有执行变量传递逻辑
- 你访问了其他未关联
SiswaController@index方法的路由直接渲染该模板
解决步骤
1. 修正路由配置(优先排查)
Laravel 8之后默认取消了路由的全局控制器命名空间前缀,你当前的字符串格式路由写法无法正确触发控制器方法,请修改web.php代码为:
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\SiswaController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', [SiswaController::class, 'index']); Route::get('/siswa', [SiswaController::class, 'index']); Route::get('/siswa/export_excel', [SiswaController::class, 'export_excel']); Route::post('/siswa/import_excel', [SiswaController::class, 'import_excel']);
2. 验证控制器逻辑正常
你可以在SiswaController的index方法中加调试代码,确认变量正常生成:
public function index() { $siswa = Siswa::all(); // 访问/siswa地址如果能输出数据集,说明控制器查询逻辑无问题 dd($siswa); return view('siswa',['siswa'=>$siswa]); }
调试正常后删除dd代码即可。
3. 模板增加容错判断
可在blade模板中增加变量存在判断,避免极端情况报错:
<a href="/siswa/export_excel" class="btn btn-success my-3" target="_blank">EXPORT EXCEL</a> <table class='table table-bordered'> <thead> <tr> <th>No</th> <th>Nama</th> <th>NIS</th> <th>Alamat</th> </tr> </thead> <tbody> @if(isset($siswa)) @php $i=1 @endphp @foreach($siswa as $s) <tr> <td>{{ $i++ }}</td> <td>{{$s->nama}}</td> <td>{{$s->nis}}</td> <td>{{$s->alamat}}</td> </tr> @endforeach @else <tr> <td colspan="4" class="text-center">暂无学生数据</td> </tr> @endif </tbody> </table> </div>
内容的提问来源于stack exchange,提问作者Lucas Futami
相关产品推荐
相关产品推荐

