
Фреймворк, по-умолчанию, требует ввода email и пароля пользователей для входа, что не всегда удобно. Иногда имеет смысл сделать вход по логину вместо электронного адреса. В данной заметке я расскажу как это сделать – вместо ввода email, пользователи будут использовать свой логин.
Стандартная страница входа имеет вид:

Если сайт у вас уже готов, наверняка форма входа имеет другой вид, но это только визуально.
Для аутентификации пользователь должен ввести email и пароль которые он вводил при регистрации. Кроме этого, им был введен логин, его то мы и будем использовать для страницы входа. Весь процесс достаточно прост. Первым делом изменим форму входа.
В шаблоне resources/views/auth/login.blade.php меняем блок
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}"> <label for="email" class="col-md-4 control-label">E-Mail Address</label> <div class="col-md-6"> <input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required autofocus> @if ($errors->has('email')) <span class="help-block"> <strong>{{ $errors->first('email') }}</strong> </span> @endif </div> </div>
на
<div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}"> <label for="name" class="col-md-4 control-label">Login</label> <div class="col-md-6"> <input id="name" type="name" class="form-control" name="name" value="{{ old('name') }}" required autofocus> @if ($errors->has('name')) <span class="help-block"> <strong>{{ $errors->first('name') }}</strong> </span> @endif </div> </div>
Т.е. тут меняем все значения (атрибутов, id и тд.) равные «email» на «name».
Поле ввода я назвал Login, можно переименовать как угодно.
Теперь нужно проследить где обрабатывается сама форма для того, чтобы поменять и там email на name.
Как можно увидеть в атрибуте action элемента <form>, форма отправляет post запрос на маршрут 'login':
<form class="form-horizontal" method="POST" action="{{ route('login') }}">
Если вы не знаете на какой контроллер и какое действие ведет маршрут, можно открыть соответствующую таблицу в консоли командой
php artisan route:list
Вот что мы увидим:

Из таблицы видно, что маршрут 'login' с запросом POST обрабатывает метод login контроллера LoginController.
Переходим к коду данного контроллера. Фреймворк Laravel использует стандарт PSR-2, а значит пространство имен которое имеет класс контроллера будет совпадать с путем к файлу. Т.е. путь к файлу данного контроллера из корня проекта - app\Http\Controllers\Auth\LoginController.php
Открыв код контроллера не находим метод login, а значит данный метод либо наследуется (т.к. все контроллеры наследуют от App\Http\Controllers\Controller) либо реализуется в подключаемых трейтах. Авторизация вряд ли будет размещаться в классе основного контроллера, а значит подозреваем трейт. В начале класса контроллера видим строку с подключением трейта:
use AuthenticatesUsers;
Смотрим код самого трейта и находим там нужный метод 'login'. Первая же строка метода:
public function login(Request $request) { $this->validateLogin($request); отправляет нас к другому методу: protected function validateLogin(Request $request) { $this->validate($request, [ $this->username() => 'required|string', 'password' => 'required|string', ]); }
Исходя из названия метода, его описания и содержимого понятно, что именно он отвечает за проверку запроса (данных из формы). Проверка осуществляется по 2-м полям. Как раз первое нас и интересует. Видим, что значение поля базы данных для первого поля не прописано как это сделано для поля 'password', а возвращается в результате выполнения метода username().
Код данного метода:
public function username() { return 'email'; }
Если исправить в самом методе, то работать будет, но только на данном компьютере и если не будет установлено соответствующее обновление пакетов, т.к. при загрузке зависимостей данного проекта будет устанавливаться оригинальный код из удаленного репозитория. То, что разработчики вынесли определение данного параметра в отдельный публичный метод намекает - мы можем его переопределить. А поэтому создаем в app/Http/Controllers/Auth/LoginController.php аналогичный метод с нужным названием поля:
public function username() { return 'name'; }
Результат:

Все, теперь вместо проверки email будет проверяться значение из поля name базы данных!