Документация Laravel 10.x
Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.
Многие веб-приложения требуют от пользователей подтверждения своих адресов электронной почты перед использованием приложения. Вместо того чтобы заставлять вас вручную реализовывать эту функцию для каждого создаваемого вами приложения, Laravel предоставляет удобные встроенные службы для отправки и проверки запросов на подтверждение электронной почты.
Примечание Хотите начать быстро? Установите один из комплектов стартовых приложений Laravel в новое приложение 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
для хранения даты и времени подтверждения адреса электронной почты пользователя. По умолчанию миграция таблицы users
, включенная в Laravel framework, уже включает этот столбец. Поэтому все, что вам нужно сделать, это запустить миграции базы данных:
php artisan migrate
Для правильной реализации подтверждения электронной почты нужно определить три маршрута. Во-первых, нужен маршрут для отображения уведомления пользователю о том, что ему следует щелкнуть ссылку подтверждения электронной почты в отправленном ему после регистрации электронном письме.
Во-вторых, нужен маршрут для обработки запросов, создаваемых, когда пользователь щелкает ссылку подтверждения электронной почты в письме.
В-третьих, нужен маршрут для повторной отправки ссылки для подтверждения, если пользователь случайно утратил первоначальную ссылку для подтверждения.
Как уже упоминалось ранее, следует определить маршрут, который вернет представление, в котором пользователю будет предложено щелкнуть по ссылке подтверждения адреса электронной почты, отправленной Laravel после регистрации. Это представление будет отображаться для пользователей, пытающихся получить доступ к другим частям приложения без предварительной проверки своего адреса электронной почты. Помните, что ссылка автоматически отправляется пользователю, при условии, что ваша модель App\Models\User
реализует интерфейс MustVerifyEmail
:
Route::get('/email/verify', function () { return view('auth.verify-email');})->middleware('auth')->name('verification.notice');
Маршрут, возвращающий уведомление о подтверждении электронной почты, должен иметь имя verification.notice
. Важно, чтобы этот маршрут был именно с этим именем, так как посредник проверки, включенный в Laravel, автоматически выполнит перенаправление на это имя маршрута, если пользователь не подтвердил свой адрес электронной почты.
Примечание При ручной реализации подтверждения по электронной почте требуется самостоятельно определить содержимое представления для уведомления о подтверждении. Если вы хотите получить настройку, которая включает все необходимые представления аутентификации и подтверждения, ознакомьтесь с комплектами стартовых приложений 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 вашего приложения, вам нужно только присоединить промежуточное программное обеспечение к определению маршрута. Обычно это промежуточное программное обеспечение сопоставляется с промежуточным программным обеспечением auth
:
Route::get('/profile', function () { // Только проверенные пользователи имеют доступ к этому маршруту...})->middleware(['auth', '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; /** * Зарегистрируйте любые службы аутентификации / авторизации. */public function boot(): void{ // ... VerifyEmail::toMailUsing(function (object $notifiable, string $url) { return (new MailMessage) ->subject('Verify Email Address') ->line('Click the button below to verify your email address.') ->action('Verify Email Address', $url); });}
Примечание Для получения дополнительной информации о почтовых уведомлениях см. документацию по почтовым уведомлениям.
При использовании комплектов стартовых приложений Laravel Laravel отправляет события во время процесса подтверждения электронной почты. Если вы вручную обрабатываете подтверждение электронной почты для своего приложения, вам может потребоваться вручную вызвать эти события после завершения подтверждения. Вы можете прикрепить прослушивателей к этим событиям в классе EventServiceProvider
вашего приложения:
use App\Listeners\LogVerifiedUser;use Illuminate\Auth\Events\Verified; /** * Сопоставления слушателей событий для приложения. * * @var array */protected $listen = [ Verified::class => [ LogVerifiedUser::class, ],];