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

Laravel 8邮箱验证点击链接报错Call to a member function getKey() on null

故障原因

报错核心原因是邮箱验证路由错误绑定了guest中间件。
guest中间件仅允许未登录的游客访问路由,游客状态下请求上下文里没有绑定登录用户信息,$this->user()直接返回null,调用getKey()自然会触发null值调用成员方法的错误。
Laravel原生邮箱验证的授权逻辑,是从当前登录会话中取出用户,和路由传入的id、hash参数做一致性校验,绑定guest中间件完全不符合该功能的运行要求。

修复方案
  1. 修正路由中间件配置
    打开路由配置文件,将验证路由的guest中间件替换为官方默认的中间件组合,修改后的代码如下:
Route::get('/verify-email/{id}/{hash}', [VerifyEmailController::class, '__invoke'])
    ->middleware(['auth', 'signed', 'throttle:6,1'])
    ->name('verification.verify');

三个中间件的作用分别是:

  • auth:强制要求访问路由的用户处于已登录状态,保证$this->user()可以返回有效的用户实例
  • signed:校验验证链接的签名合法性,防止链接参数被恶意篡改
  • throttle:6,1:接口限流,单IP1分钟内最多允许请求6次,避免恶意刷接口

注意:不要直接修改vendor目录下的框架原生EmailVerificationRequest.php文件,否则后续执行Composer依赖更新时自定义代码会被直接覆盖。

  1. 特殊场景适配(可选)
    如果你需要支持用户未登录时点击邮件链接也能完成验证,不要使用guest中间件,需要自行重写验证请求类的authorize方法:先通过路由参数中的id查询对应用户实例,再做id和hash的比对,验证完成后手动登录对应用户再做跳转。该场景需要额外处理异常跳转、签名校验失效的提示逻辑,无特殊需求直接使用默认配置即可。

内容的提问来源于stack exchange,提问作者Colin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:33:39