Laravel 10:如何在ViewServiceProvider中获取认证用户?
在Laravel 10的ViewComposer中获取认证用户的解决方法
问题原因
全局注册的ViewComposer会在所有视图渲染时执行,包括未经过认证中间件的请求;如果路由未应用web中间件组(包含Session、认证会话等关键组件),也会导致auth()->user()返回null。
解决方案
1. 在MenuComposer中正确获取用户
直接在compose方法中调用auth()->user()或request()->user(),同时处理用户未登录的场景:
<?php namespace App\View\Composers; use App\Main\SideMenu; use App\Main\SimpleMenu; use App\Main\TopMenu; use Illuminate\Support\Facades\Auth; use Illuminate\View\View; class MenuComposer { public function compose(View $view): void { // 获取认证用户 $user = Auth::user(); // 等价于 request()->user() if (! is_null(request()->route())) { $pageName = request()->route()->getName(); $layout = $this->layout($view); $activeMenu = $this->activeMenu($pageName, $layout); // 原有绑定逻辑 $view->with('topMenu', TopMenu::menu()); $view->with('sideMenu', SideMenu::menu()); $view->with('simpleMenu', SimpleMenu::menu()); $view->with('firstLevelActiveIndex', $activeMenu['first_level_active_index']); $view->with('secondLevelActiveIndex', $activeMenu['second_level_active_index']); $view->with('thirdLevelActiveIndex', $activeMenu['third_level_active_index']); $view->with('pageName', $pageName); $view->with('layout', $layout); // 将用户传递到视图 $view->with('authUser', $user); } } // 保留原有layout、activeMenu方法 }
2. 确保路由应用正确中间件
- Web路由默认位于
routes/web.php,已自动包含web中间件组(包含Session、认证会话等必要组件)。 - 自定义认证路由组时,手动添加
web和auth中间件:
// routes/web.php Route::middleware(['web', 'auth'])->group(function () { // 需要认证的页面路由 });
3. 优化ViewComposer注册范围(可选)
如果MenuComposer仅需在已认证页面生效,不要全局绑定到所有视图(*),指定具体视图或视图组减少不必要执行:
// ViewServiceProvider.php public function boot(): void { // 仅绑定到后台布局或认证页面视图 View::composer(['layouts.app', 'dashboard.*'], MenuComposer::class); // 其他Composer注册保持不变 }
4. 检查Session配置
打开config/session.php,确保驱动未设置为array(仅用于测试,不持久化Session),推荐使用file或database:
'driver' => env('SESSION_DRIVER', 'file'),
内容的提问来源于stack exchange,提问作者Sasha
相关产品推荐
相关产品推荐

