git e40c6670934574de22db31ad6e84c4a035d65c6c
Многие веб-приложения требуют от пользователей подтверждения своего адреса электронной почты перед использованием приложения. Вместо того чтобы заставлять вас самостоятельно реализовывать этот функционал повторно для каждого создаваемого вами приложения, Laravel предлагает удобные встроенные службы для отправки и проверки запросов подтверждения адреса электронной почты.
{tip} Хотите быстро начать? Установите один из стартовых комплектов в новое приложение Laravel. Стартовые комплекты позаботятся о построении всей вашей системы аутентификации, включая поддержку подтверждения электронной почты.
Убедитесь, что ваша модель App\Models\User
реализует контракт Illuminate\Contracts\Auth\MustVerifyEmail
:
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
// ...
}
Как только этот интерфейс будет добавлен в вашу модель, вновь зарегистрированным пользователям будет автоматически отправлено электронное письмо со ссылкой для подтверждения адреса электронной почты. Изучив App\Providers\EventServiceProvider
, вы можете увидеть, что Laravel уже содержит слушатель SendEmailVerificationNotification
, который прикреплен к событию Illuminate\Auth\Events\Registered
. Этот слушатель события отправит по электронной почте пользователю ссылку для подтверждения.
Если вы самостоятельно выполняете регистрацию в своем приложении вместо использования стартового комплекта, то вы должны убедиться, что запускаете событие Illuminate\Auth\Events\Registered
после успешной регистрации пользователя:
use Illuminate\Auth\Events\Registered;
event(new Registered($user));
Ваша таблица users
должна содержать столбец email_verified_at
для сохранения даты и времени подтверждения адреса электронной почты пользователем. По умолчанию миграция таблицы пользователей, содержащаяся в Laravel, уже содержит этот столбец. Просто запустите миграцию базы данных:
php artisan migrate
Чтобы правильно реализовать подтверждение электронной почты, необходимо определить три маршрута. Во-первых, потребуется маршрут для отображения уведомления пользователю о том, что он должен щелкнуть ссылку подтверждения электронной почты в письме, которое Laravel отправит ему после регистрации.
Во-вторых, потребуется маршрут для обработки запросов, сгенерированных, когда пользователь щелкает ссылку подтверждения электронной почты в электронном письме.
В-третьих, потребуется маршрут для повторной отправки ссылки для подтверждения, если пользователь случайно потеряет первую ссылку для подтверждения.
Как упоминалось ранее, должен быть определен маршрут, возвращающий страницу, инструктирующую пользователя щелкнуть ссылку для подтверждения электронной почты, которая была отправлена ему Laravel по электронной почте после регистрации. Эта страница будет отображаться для пользователей, когда они попытаются получить доступ к другим частям приложения без предварительной проверки своего адреса электронной почты. Помните, что ссылка автоматически отправляется пользователю по электронной почте, если ваша модель App\Models\User
реализует интерфейс MustVerifyEmail
:
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
Маршрут, который возвращает уведомление о подтверждении по электронной почте, должен называться verification.notice
. Важно, чтобы маршруту было присвоено это точное имя, поскольку посредник verify
, включенный в Laravel, будет автоматически перенаправлять на это имя маршрута, если пользователь не подтвердил свой адрес электронной почты.
{tip} При выполнении проверки электронной почты самостоятельно, вам необходимо определить содержание страницы уведомления о проверке. Если вам необходим каркас, включающий все необходимые страницы для аутентификации и проверки, ознакомьтесь со стартовыми комплектами приложений Laravel.
Затем, нам нужно определить маршрут, обрабатывающий запросы, сгенерированные, когда пользователь щелкает ссылку подтверждения электронной почты, которая была отправлена ему по электронной почте. Этот маршрут должен называться verification.verify
и ему должны быть назначены посредники auth
и signed
:
use Illuminate\Foundation\Auth\EmailVerificationRequest;
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
$request->fulfill();
return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');
Прежде чем двигаться дальше, давайте подробнее рассмотрим этот маршрут. Во-первых, вы заметите, что мы используем тип запроса EmailVerificationRequest
вместо типичного экземпляра Illuminate\Http\Request
. EmailVerificationRequest
– это запрос формы, который включен в Laravel. Этот запрос автоматически позаботится о проверке параметров запроса id
и hash
.
Далее, мы можем приступить непосредственно к вызову метода fulfill
запроса. Этот метод вызовет метод markEmailAsVerified
для аутентифицированного пользователя и запустит событие Illuminate\Auth\Events\Verified
. Метод markEmailAsVerified
доступен для модели по умолчанию App\Models\User
через базовый класс Illuminate\Foundation\Auth\User
. После подтверждения адреса электронной почты пользователя вы можете перенаправить его куда пожелаете.
Иногда пользователь может потерять или случайно удалить письмо с подтверждением адреса электронной почты. Чтобы учесть это, вы можете определить маршрут, позволяющий пользователю запрашивать повторную отправку письма с подтверждением. Затем, вы можете сделать запрос по этому маршруту, поместив простую кнопку отправки формы на странице уведомления о подтверждении:
use Illuminate\Http\Request;
Route::post('/email/verification-notification', function (Request $request) {
$request->user()->sendEmailVerificationNotification();
return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');
Посредник маршрута может использоваться только для того, чтобы разрешить доступ к конкретному маршруту только подтвержденным пользователям. Laravel содержит посредник verified
, который ссылается на класс Illuminate\Auth\Middleware\EnsureEmailIsVerified
. Поскольку этот посредник уже зарегистрирован в HTTP-ядре вашего приложения, все, что вам нужно сделать, так это назначить посредник маршруту:
Route::get('/profile', function () {
// Только подтвержденные пользователи могут получить доступ к этому маршруту ...
})->middleware('verified');
Если непроверенный пользователь попытается получить доступ к маршруту, которому назначен этот посредник, то он будет автоматически перенаправлен на именованный маршрут verification.notice
.
Хотя уведомление о подтверждении электронной почты по умолчанию должно удовлетворять требованиям большинства приложений, Laravel позволяет вам изменить сообщение подтверждения электронной почты.
Для начала, передайте замыкание методу toMailUsing
уведомления Illuminate\Auth\Notifications\VerifyEmail
. Замыкание получит экземпляр модели, содержащий уведомление, а также подписанный URL-адрес подтверждения электронной почты, который пользователь должен посетить для проверки адреса электронной почты. Замыкание должно вернуть экземпляр Illuminate\Notifications\Messages\MailMessage
. Как правило, вызов метода toMailUsing
осуществляется в методе boot
класса App\Providers\AuthServiceProvider
вашего приложения:
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
/**
* Регистрация любых служб аутентификации / авторизации.
*
* @return void
*/
public function boot()
{
// ...
VerifyEmail::toMailUsing(function ($notifiable, $url) {
return (new MailMessage)
->subject('Verify Email Address')
->line('Click the button below to verify your email address.')
->action('Verify Email Address', $url);
});
}
{tip} Чтобы узнать больше о почтовых уведомлениях, обратитесь к документации по почтовым уведомлениям.
При использовании стартовых комплектов Laravel запускает события в процессе проверки электронной почты. Если вы самостоятельно обрабатываете проверку электронной почты для своего приложения, то вы должны запускать эти события после завершения проверки. Вы можете назначить слушателей для этих событий в EventServiceProvider
вашего приложения:
/**
* Карта слушателей событий приложения.
*
* @var array
*/
protected $listen = [
'Illuminate\Auth\Events\Verified' => [
'App\Listeners\LogVerifiedUser',
],
];