【发布时间】:2021-09-23 23:59:51
【问题描述】:
我正在使用 Laravel 8 构建一个 rest api。我想覆盖默认的 EnsureEmailisVerified 中间件并将我拥有的代码从控制器移动到该中间件中。
我的登录控制器中用于检查电子邮件是否已验证的代码是;
if (!$user->hasVerifiedEmail()) {
return response()->json([
'message' => 'You need to confirm your account. We have sent you an activation link to your email.'
], 422);
}
这很好用,但我想把它移出控制器,所以我创建了一个中间件并将代码移入其中,如下所示;
class EnsureEmailIsVerified
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next): mixed
{
if (! $request->user() ||
($request->user() instanceof MustVerifyEmail &&
! $request->user()->hasVerifiedEmail())) {
return response()->json([
'message' => 'You need to confirm your account. We have sent you an activation link to your email.'
], 422);
}
return $next($request);
}
}
然后在我的Kernel.php 文件中添加;
'verified' => \App\Http\Middleware\EnsureEmailIsVerified::class,
然后我的登录路径是这样的;
Route::post('login', [Auth\AuthenticationController::class, 'login'])->middleware('verified');
问题是它根本没有触发......当我点击登录路由时,它似乎没有检查电子邮件是否经过验证,只是让用户登录。
【问题讨论】:
-
$request->user()将在中间件上返回 null。在我的情况下,我在用户表上有一个status字段,我检查if (auth()->user()->status == 0) { ... }。您可以在您的路由上使用web中间件,然后您可以在您的verified中间件上使用auth()->user()->hasVerifiedEmail()
标签: php laravel laravel-middleware