Laravel 5.8 @guest无法识别自定义guard及多guard Blade使用问题
解决Laravel 5.8多Guard在Blade模板中的适配问题
先给你理清楚核心问题:Laravel的@guest和@auth指令默认是读取config('auth.defaults.guard')配置的默认Guard来判断登录状态的,所以哪怕你的admins Guard已经登录,只要默认Guard没登录,@guest就会判定为未登录状态。下面给你几种实用的解决方案:
1. 给@guest/@auth指定具体Guard参数
如果明确要判断某个Guard的登录状态,直接给指令传Guard名称即可,这是最直接的方式:
{{-- 判断管理员是否登录 --}} @auth('admins') <div>欢迎管理员:{{ Auth::guard('admins')->user()->name }}</div> <form action="{{ route('admin.logout') }}" method="POST"> @csrf <button type="submit">退出登录</button> </form> @endauth @guest('admins') <a href="{{ route('admin.login') }}">管理员登录</a> @endguest {{-- 判断供应商是否登录 --}} @auth('suppliers') <div>欢迎供应商:{{ Auth::guard('suppliers')->user()->name }}</div> <form action="{{ route('logout') }}" method="POST"> @csrf <button type="submit">退出登录</button> </form> @endauth @guest('suppliers') <a href="{{ route('login') }}">供应商登录</a> @endguest
2. 未知登录Guard时,自动遍历所有Guard判断
如果不确定用户是通过哪个Guard登录的,可以遍历配置里的所有Guard,找到已登录的那个,再获取用户信息:
@php // 初始化登录用户变量 $loggedUser = null; // 获取所有配置的Guard名称 $allGuards = array_keys(config('auth.guards')); // 遍历每个Guard,检查是否已登录 foreach ($allGuards as $guard) { if (Auth::guard($guard)->check()) { $loggedUser = Auth::guard($guard)->user(); break; } } @endphp @if($loggedUser) <p>欢迎你,{{ $loggedUser->name }}</p> {{-- 根据用户模型类型,显示对应退出按钮 --}} @if($loggedUser instanceof \App\User) <form action="{{ route('admin.logout') }}" method="POST"> @csrf <button type="submit">管理员退出</button> </form> @elseif($loggedUser instanceof \App\Supplier) <form action="{{ route('logout') }}" method="POST"> @csrf <button type="submit">供应商退出</button> </form> @endif @else <a href="{{ route('login') }}">供应商登录</a> <a href="{{ route('admin.login') }}">管理员登录</a> @endif
3. 自定义Blade指令(优雅复用版)
如果项目中经常需要判断多Guard登录状态,可以自定义Blade指令,让代码更简洁:
在App\Providers\AppServiceProvider的boot方法中添加以下代码:
use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Auth; public function boot() { // 自定义@anyauth指令:判断任意Guard是否登录 Blade::directive('anyauth', function () { return "<?php \$isLoggedIn = false; \$guards = array_keys(config('auth.guards')); foreach (\$guards as \$guard) { if (Auth::guard(\$guard)->check()) { \$isLoggedIn = true; break; } } if (\$isLoggedIn) : ?>"; }); Blade::directive('endanyauth', function () { return "<?php endif; ?>"; }); // 自定义@currentuser指令:输出当前登录用户的名称 Blade::directive('currentuser', function () { return "<?php \$user = null; \$guards = array_keys(config('auth.guards')); foreach (\$guards as \$guard) { if (Auth::guard(\$guard)->check()) { \$user = Auth::guard(\$guard)->user(); break; } } echo \$user ? \$user->name : ''; ?>"; }); }
之后在Blade模板中就可以这样用:
@anyauth <p>欢迎你,@currentuser</p> {{-- 这里可以添加通用的退出逻辑,或者根据用户类型做判断 --}} @endanyauth @guest <a href="{{ route('login') }}">供应商登录</a> <a href="{{ route('admin.login') }}">管理员登录</a> @endguest
内容的提问来源于stack exchange,提问作者RomkaLTU
相关产品推荐
相关产品推荐

