如何为已验证用户展示不同菜单?Laravel Blade模板实现方案排查
Laravel Blade 已验证用户菜单展示问题解析
让我来帮你理清这几种写法的问题和解决方案:
1. 关于 @verified 指令的问题
你第一个写法里用的 @verified 和 @endverified Laravel 默认并不提供这个内置指令,这就是它无法生效的核心原因。如果想要用这种简洁的指令写法,你需要自定义一个 Blade 指令。
自定义 @verified 指令的方法
在你的 App\Providers\AppServiceProvider 的 boot 方法中添加以下代码:
use Illuminate\Support\Facades\Blade; public function boot() { Blade::if('verified', function () { // 检查用户已登录且邮箱已验证 return auth()->check() && !is_null(auth()->user()->email_verified_at); }); }
定义完成后,你第一个写法的代码就能正常工作了,这种方式的优势是代码更简洁,适合在多个页面重复使用已验证用户判断的场景。
2. 第二种写法的合理性
你提到的第二种写法是非常稳妥且推荐的原生写法:
<ul> @guest <li><a href="/">Home</a></li> <li><a href="#login">Log in</a></li> <li><a href="#signup">Sign up</a></li> @endguest @auth @if (auth()->user()->email_verified_at) <li><a href="/">Dashboard</a></li> <li><a href="#profile">Profile</a></li> <li><a href="#logout">Log out</a></li> @endif @endauth </ul>
它不需要任何额外配置,直接利用 Laravel 内置的 @auth/@guest 指令,配合用户模型默认的 email_verified_at 字段做判断,兼容性强,所有使用默认用户表结构的 Laravel 项目都能直接运行,可读性也很清晰,适合大多数场景。
3. 第三种写法失效的原因
你尝试的 @auth('verified') 写法是错误的:
@auth('verified') <!-- 菜单内容 --> @endauth
@auth 指令的参数是认证守卫(Guard)的名称(比如默认的 web、api),而不是用户的验证状态。Laravel 中不存在名为 verified 的守卫,所以这段代码永远不会触发,自然无法正常显示菜单。
总结建议
- 如果你追求代码简洁且需要多处复用已验证判断,优先选择自定义
@verified指令的方案。 - 如果你想快速实现功能、避免额外配置,第二种原生写法是最稳妥的选择。
- 第三种写法属于对
@auth指令的误用,建议直接弃用。
内容的提问来源于stack exchange,提问作者Wouter
相关产品推荐
相关产品推荐

