Laravel 8控制器向视图传递变量出现$query未定义错误如何解决
Laravel 8 变量传递报错修复方案
错误根因
- 路由重复定义:相同的
GET /userscontrollers路由被定义了两次,Laravel路由匹配规则为从上到下优先匹配后定义的路由,因此访问该路径时永远只会触发Dashboardcheck::userscontroll方法,传递了变量的UsersController::userscontroller_show方法完全不会被执行。 - 视图传参缺失:
Dashboardcheck::userscontroll方法权限校验通过后返回视图时,没有传递模板所需的用户列表$query变量,方法内定义的$query仅用于查询当前登录用户的权限信息,和模板需要的用户列表数据无关。
原报错信息:
$query is undefined Make the variable optional in the blade template. Replace {{ $query }} with {{ $query ?? '' }}
修复步骤
方案一(推荐:合并权限校验+数据查询逻辑,无安全风险)
- 清理重复路由,仅保留权限校验相关的路由配置即可:
// 删掉原来的UsersController对应的同路径路由,只保留这一条 Route::get('/userscontrollers', [Dashboardcheck::class, 'userscontroll']);
- 修改
Dashboardcheck::userscontroll方法,权限校验通过后查询用户列表数据并传递给视图:
namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Session; class Dashboardcheck extends Controller { function login(){ if(Session::has('user')){ return view('Pages.dashboard'); }else{ return redirect('/'); } } function userscontroll(){ if(Session::has('user')){ // 重命名当前用户查询变量,避免和用户列表变量冲突 $currentUser = DB::table('user') ->where('nick_user', Session::get('user')) ->first(); if($currentUser->user_permission >= 4){ // 权限校验通过后,查询模板需要的用户列表数据 $query = DB::table('user') ->select('id_users', 'nick_user', 'email_user', 'verification_user') ->get() ->toArray(); // 传递变量到视图 return view('Pages.Dashboard.usercontroll', compact('query')); }else{ return redirect('/dashboard')->with('alert', 'Nie posiadasz uprawnien do przeglądania tych treści'); } }else{ return redirect('/'); } } }
- 冗余的
UsersController::userscontroller_show方法可直接删除。
方案二(路由拆分,需额外加权限校验)
如果需要保留两个控制器的独立逻辑,可给两个路由分配不同的访问路径,同时给用户列表路由补充权限校验,避免未授权用户直接访问用户数据:
// 权限校验路由 Route::get('/userscontrollers', [Dashboardcheck::class, 'userscontroll']); // 用户列表查询路由,需额外补充权限校验中间件 Route::get('/userscontrollers/list', [UsersController::class, 'userscontroller_show']);
修改后访问/userscontrollers/list即可正常获取传递的$query变量。
内容的提问来源于stack exchange,提问作者patryk6654
相关产品推荐
相关产品推荐

