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

如何为已验证用户展示不同菜单?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:04:08