Laravel多认证:判断用户登录状态并切换导航栏显示
解决Laravel多认证场景下前端导航的动态显示问题
嘿,针对你在Laravel多认证中遇到的前端导航切换需求,我整理了一套适配你现有配置的实现方案,分控制器逻辑处理和视图模板渲染两部分来说明:
一、前端控制器(FrontendController)处理登录状态
在你的FrontendController的index方法(或其他前端页面方法)中,我们需要遍历所有自定义守卫,判断当前是否有用户登录,并获取对应守卫的仪表盘路由,最后传递到视图:
修改FrontendController的index方法:
public function index() { $logos = University::orderBy('id', 'ASC') ->where([ ['status', '=', 'active'] ]) ->limit(8) ->get(); // 初始化登录状态变量 $loggedInUser = null; $dashboardRoute = ''; $currentGuard = ''; // 遍历所有自定义守卫,检查登录状态 $guards = ['student', 'admin', 'university', 'school', 'web']; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { $loggedInUser = Auth::guard($guard)->user(); $currentGuard = $guard; // 根据守卫类型匹配对应仪表盘路由 switch ($guard) { case 'student': $dashboardRoute = route('student.index'); // 对应你的StudentController@index路由 break; case 'admin': $dashboardRoute = route('admin.dashboard'); // 替换为你的管理员仪表盘路由 break; case 'university': $dashboardRoute = route('university.dashboard'); // 替换为大学用户仪表盘路由 break; case 'school': $dashboardRoute = route('school.dashboard'); // 替换为学校用户仪表盘路由 break; case 'web': $dashboardRoute = route('user.dashboard'); // 默认web用户仪表盘路由 break; } break; // 找到已登录守卫后终止循环 } } return view('student::index') ->withLogos($logos) ->with('loggedInUser', $loggedInUser) ->with('dashboardRoute', $dashboardRoute) ->with('currentGuard', $currentGuard); }
二、视图模板中动态渲染导航
在你的前端视图(比如公共导航模板或student::index页面)中,使用Blade语法判断登录状态,动态切换导航项:
<!-- 导航栏示例 --> <nav class="navbar"> <ul class="nav-links"> <li><a href="/">首页</a></li> <!-- 动态导航逻辑 --> @if($loggedInUser) <!-- 已登录状态:显示欢迎语+仪表盘链接 --> <li> <a href="{{ $dashboardRoute }}"> 欢迎, {{ $loggedInUser->first_name ?? $loggedInUser->name }}! 我的仪表盘 </a> </li> <!-- 退出登录按钮(匹配当前守卫) --> <li> <form action="{{ route($currentGuard.'.logout') }}" method="POST"> @csrf <button type="submit" class="logout-btn">退出登录</button> </form> </li> @else <!-- 未登录状态:显示各类用户登录入口 --> <li><a href="/student/login">学生登录</a></li> <li><a href="/admin/login">管理员登录</a></li> <li><a href="/university/login">大学登录</a></li> <li><a href="/school/login">学校登录</a></li> @endif </ul> </nav>
补充:多守卫的退出路由配置
因为是多认证场景,需要给每个守卫配置独立的退出路由,在routes/web.php中添加:
// 学生退出路由 Route::post('/student/logout', function () { Auth::guard('student')->logout(); return redirect('/'); })->name('student.logout'); // 管理员退出路由 Route::post('/admin/logout', function () { Auth::guard('admin')->logout(); return redirect('/'); })->name('admin.logout'); // 大学用户退出路由 Route::post('/university/logout', function () { Auth::guard('university')->logout(); return redirect('/'); })->name('university.logout'); // 学校用户退出路由 Route::post('/school/logout', function () { Auth::guard('school')->logout(); return redirect('/'); })->name('school.logout');
三、可选优化:全局共享登录状态
如果多个前端页面都需要判断登录状态,可以在AppServiceProvider的boot方法中全局共享变量,避免重复代码:
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\View; public function boot() { View::composer('*', function ($view) { $loggedInUser = null; $dashboardRoute = ''; $currentGuard = ''; $guards = ['student', 'admin', 'university', 'school', 'web']; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { $loggedInUser = Auth::guard($guard)->user(); $currentGuard = $guard; // 路由匹配逻辑同控制器部分 switch ($guard) { case 'student': $dashboardRoute = route('student.index'); break; case 'admin': $dashboardRoute = route('admin.dashboard'); break; // 其他守卫路由配置 } break; } } $view->with(compact('loggedInUser', 'dashboardRoute', 'currentGuard')); }); }
这样所有视图都能直接使用这三个变量,无需在每个控制器中重复传递。
内容的提问来源于stack exchange,提问作者bhattraideb
相关产品推荐
相关产品推荐

