Laravel根据用户登录状态动态切换导航栏按钮的方法
实现方案
你当前的登录逻辑已经把用户ID存入了session的loginId字段,直接基于这个session标识做模板条件渲染就能实现导航栏按钮切换,具体操作如下:
- 先补全退出登录逻辑
先在你的认证控制器里新增退出方法,清除登录session:
然后在路由文件里绑定退出路由:public function logout() { // 清除登录标识 session()->forget('loginId'); return redirect('/login'); }Route::get('/logout', [你的认证控制器类名::class, 'logout'])->name('logout'); - 修改导航栏公共模板
找到你存放导航栏的公共Blade模板文件(一般是resources/views/layouts/下的公共布局文件),在按钮位置加条件判断:<div class="navbar-nav ms-auto"> {{-- 已登录状态渲染内容 --}} @if (session()->has('loginId')) <a href="{{ url('/dashboard') }}" class="nav-item nav-link">控制台</a> <a href="{{ route('logout') }}" class="nav-item nav-link">退出登录</a> {{-- 未登录状态渲染内容 --}} @else <a href="{{ url('/login') }}" class="nav-item nav-link">登录</a> <a href="{{ url('/register') }}" class="nav-item nav-link">注册</a> @endif </div> - (可选)全局共享登录用户信息
如果你需要在导航栏显示用户名、头像等用户信息,避免每个页面单独传参、重复查库,可以在app/Providers/AppServiceProvider.php的boot方法中添加全局视图共享变量:
配置完成后,直接在导航栏模板里调用变量即可,比如显示欢迎语:<?php namespace App\Providers; use App\Models\User; use Illuminate\Support\Facades\View; class AppServiceProvider extends ServiceProvider { public function boot() { // 所有视图都可以直接使用 $currentUser 变量获取当前登录用户 View::share('currentUser', session('loginId') ? User::find(session('loginId')) : null); } }@if($currentUser) <span class="nav-link">欢迎回来,{{ $currentUser->name }}</span> @endif
注意:如果你的站点开启了页面缓存,需要把导航栏部分设为不缓存,或者在用户登录/退出操作后清除对应页面缓存,避免按钮状态不更新。
内容的提问来源于stack exchange,提问作者subash
相关产品推荐
相关产品推荐

