如何在 Laravel 5.8 上仍然使用 "middleware:('verified')" 的同时允许访客访问页面?

How to allow guest access to page while still using "middleware:('verified')" on Laravel 5.8?

我希望来宾访问主页和商店页面,并且在用户想要注册时仍然验证电子邮件。

Route::get('/home', 'HomeController@index')->name('home')->middleware('verified');

EnsureEmailIsVerified 中间件要求用户登录才能访问受其保护的任何页面。

您可以在 code for the middleware

中看到此检查
if (!$request->user() ||
    ($request->user() instanceof MustVerifyEmail &&
        !$request->user()->hasVerifiedEmail())) {
    // reject
}

如果您希望允许来宾访问该页面,但仍需要激活用户,您将需要创建一个自定义中间件。

php artisan make:middleware GuestOrActivated

然后,对于 handle 函数:

public function handle($request, Closure $next, $redirectToRoute = null)
{
    if ($request->user() && $request->user() instanceof MustVerifyEmail && !$request->user()->hasVerifiedEmail()) {
        return $request->expectsJson()
            ? abort(403, 'Your email address is not verified.')
            : Redirect::route($redirectToRoute ?: 'verification.notice');
    }
    return $next($request);
}

对于这种情况,我制作了新的中间件,在重定向到电子邮件验证之前,我刷新了会话,所以当用户回到家时,他将重定向到再次登录

class GuestOrActivated
{
    public function handle($request, Closure $next, $redirectToRoute = null)
    {
        if ($request->user() && $request->user() instanceof MustVerifyEmail && !$request->user()->hasVerifiedEmail()) {
            request()->session()->flush();
            return Redirect::route('verification.notice');
        }
        return $next($request);
    }
}