You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:54:53