Laravel Snippets - Livewire Auth
07.02.2021
Часто в различных тематических лентах мне попадаются интересные приемы или реализации небольших частей функционала на Laravel. Как известно, лучший способ что-то понять, сделать это самому, поэтому я решил каждую заинтересовавшую меня статью «превращать» в репозиторий на GitHub, попутно разбираясь в деталях. Возможно, такие «сниппеты» потом получится переиспользовать в других проектах и делать их будет намного быстрее.
Готовая реализация - https://github.com/poymanov/ls-livewire-auth
Первым таким проектом будет реализация системы регистрации/авторизации на компонентах Livewire. Нечто подобное я уже делал в проекте Post A Comment.
Всё началось с того, что я нашёл уже готовый пакет с похожим функционалом, но на моём окружении он отказался работать. Там была реализована автоматическая генерация роутинга для компонентов Livewire, в которой почему-то неправильно определялся путь к директории app (спасибо за помощь в поиске проблемы Xdebug 3, в очередной раз убеждаюсь что это лучше чем dd()). В итоге, автор этого пакета вообще признал его deprecated, и выпустил какой-то другой, с которым мне уже не захотелось разбираться.
За основу я взял логику из прекраснейшего laravel/breeze, с незначительными изменениями - роутинг основных страниц переделан для использования с компонентами Livewire и добавлены тесты для этих компонентов.
Теперь разберём как выглядит и работает приложение более подробнее.
Все основные элементы управления располагаются в шапке страницы. Для гостей отображаются ссылки на регистрацию и авторизацию:
Для авторизованных пользователей - ссылка на завершение пользовательской сессии:
Гости могут перейти на страницу регистрации:
Здесь для заполнения предлагаются привычные для любого приложения поля - Имя, Email, Пароль и его подтверждение.
После регистрации на указанную почту приходит письмо с ссылкой для подтверждения учётной записи:

После этого можно перейти к авторизации:

Пользователь не может авторизоваться, пока не подтвердит свою учётную запись и может повторно запросить письмо для активации учётной записи:

Другая часть функционала системы авторизации - сброс пароля.
Перейти на страницу сброса пароля можно через ссылку под формой авторизации:

Здесь требуется указать почту, на которую была зарегистрирована учетная запись:

После этого на почту придёт специальное письмо для установки нового пароля:

После перехода по ссылке требуется установить новый пароль:

После этого можно авторизоваться с использованием нового пароля.
Особенности приложения:
- Мгновенная авторизация в полях форм (заслуга Livewire). Например, при вводе почты для сброса пароля сразу проверяется что такая почта существует, нет необходимости отправлять форму, чтобы узнать что указана неправильная почта;
- Пользователь не может авторизоваться без подтверждения учетной записи. В Laravel по-умолчанию присутствует функционал подтверждения учетной записи, но в стартовых наборах для авторизации (по крайней мере, в laravel/breeze) отсутствует строгая проверка состояния подтверждения при авторизации. Я решил добавить такую проверку, как минимум ради интереса и в качестве обучающего момента;
- Добавлены тесты. Я постарался протестировать максимально возможное количество кейсов, которые могут возникнуть при регистрации, авторизации и сбросе пароля.
Что я вынес из данного проекта:
- Для себя решил придерживаться практики вынесения всех фраз из шаблонов в переводы. Мне кажется, что так разметка выглядит аккуратнее, ну и в будущем всегда можно добавить функционал переключения языка приложения;
- В тестах пустой шаблон компонента не считается отрисованным. Необходимо добавить хотя бы пустой div, чтобы компонент отрисовался и можно было понять, что всё прошло без ошибок;
- Оказывается, пользовательская сессия не завершается при закрытии браузера и выглядит всё так, как будто включена опция "Запомнить меня". Чтобы всё работало более привычно - если "Запомнить меня", то сессия держится даже после закрытия браузера, а без опции - завершается сразу, необходимо внести изменения в конфиг - config/session.php ('expire_on_close' => true);
- Стандартные письма Laravel, содержимое которых регулируется не через шаблоны .blade.php, а через Mailable-объекты можно изменять через переопределение в AppServiceProvider.php. Это пригодилось мне для переноса текстов писем в языковые переменные.
Об авторе
Пойманов Николай
PHP-разработчик