Middleware verified
Middleware verified в Laravel используется для защиты маршрутов от доступа пользователей, у которых не подтверждён email-адрес. Это встроенный посредник, который проверяет, прошёл ли текущий пользователь верификацию email. Если пользователь не подтвердил свой email, он будет перенаправлен на страницу уведомления о необходимости верификации. Middleware применяется к маршрутам, которые требуют подтверждённого email для доступа. Он работает в паре с трейтом MustVerifyEmail в модели пользователя и встроенными контроллерами верификации.
Настройка модели User
Для использования middleware необходимо реализовать интерфейс MustVerifyEmail в модели пользователя:
<?php
namespace AppModels;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateContractsAuthMustVerifyEmail;
use IlluminateNotificationsNotifiable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
protected $fillable = [
'name',
'email',
'password',
];
protected $hidden = [
'password',
'remember_token',
];
}
?>
Применение middleware к маршрутам
Middleware verified применяется к маршрутам в файле web.php. Его можно использовать отдельно или в комбинации с другими middleware:
<?php
use IlluminateSupportFacadesRoute;
use AppHttpControllersDashboardController;
use AppHttpControllersProfileController;
use AppHttpControllersSettingsController;
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])
->name('dashboard');
Route::get('/profile', [ProfileController::class, 'edit'])
->name('profile.edit');
Route::get('/settings', [SettingsController::class, 'index'])
->name('settings');
});
?>
Также можно применить middleware к отдельному маршруту:
<?php
use IlluminateSupportFacadesRoute;
use AppHttpControllersOrderController;
Route::get('/orders', [OrderController::class, 'index'])
->middleware(['auth', 'verified'])
->name('orders.index');
?>
Пример работы middleware
Создадим контроллер для защищённого маршрута:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class DashboardController extends Controller
{
public function index()
{
$res = 'Welcome to dashboard, your email is verified';
return view('dashboard', ['message' => $res]);
}
}
?>
Теперь определим маршрут с middleware:
<?php
use IlluminateSupportFacadesRoute;
use AppHttpControllersDashboardController;
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware(['auth', 'verified'])
->name('dashboard');
?>
Если пользователь залогинен, но не подтвердил email, при попытке перехода на /dashboard он будет перенаправлен на страницу /email/verify. Если email подтверждён, пользователь увидит содержимое защищённой страницы.
Настройка страницы верификации
Для отображения страницы уведомления о необходимости верификации используется маршрут /email/verify. В контроллере можно получить информацию о пользователе:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateFoundationAuthEmailVerificationRequest;
class VerificationController extends Controller
{
public function notice(Request $request)
{
$user = $request->user();
if ($user->hasVerifiedEmail()) {
return redirect()->route('dashboard');
}
$res = 'Please verify your email address';
return view('auth.verify', ['message' => $res, 'user' => $user]);
}
}
?>
Результат выполнения метода hasVerifiedEmail:
false
Обработка верификации в контроллере
Пример обработки подтверждения email после клика по ссылке из письма:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateFoundationAuthEmailVerificationRequest;
class VerifyEmailController extends Controller
{
public function __invoke(EmailVerificationRequest $request)
{
$request->fulfill();
$res = 'Email verified successfully';
return redirect()->route('dashboard')
->with('message', $res);
}
}
?>
Проверка верификации в шаблоне Blade
В шаблоне можно проверить статус верификации пользователя:
@auth
@if (auth()->user()->hasVerifiedEmail())
<p>Your email is verified</p>
@else
<p>Please verify your email address</p>
<a href="{{ route('verification.send') }}">Resend verification email</a>
@endif
@endauth
Результат выполнения для неподтверждённого пользователя:
"Please verify your email address"
Смотрите также
-
метод
hasVerifiedEmail,
который проверяет подтверждение email у пользователя -
метод
markEmailAsVerified,
который помечает email как подтверждённый -
метод
auth,
который проверяет аутентификацию пользователя -
метод
guest,
который ограничивает доступ для гостей