В laravel для попытки входа в систему я обычно использую что-то вроде этого:
if (Auth::attempt(array('email' => $usernameinput, 'password' => $password), true)) { // The user is being remembered... }
В основном $usernameinput
будет проверяться с помощью email
из моей таблицы.
Я думал сделать это по-другому, например, в моей таблице есть email
, username
и password
. $usernameinput
может быть как по email
и по username
в моей таблице.
Как я могу Auth::attempt
с условием типа:
(email==$usernameinput OR username==$usernameinput) AND password == $password
Ну, вы можете просто проверить, соответствует ли $usernameinput
шаблону электронной почты, и если да, используйте поле email
, иначе используйте поле username
. Это звучит разумно, потому что, действительно, у вас действительно не должно быть электронной почты в вашей базе данных, которая не соответствует шаблону. Что-то вроде этого:
$field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; if (Auth::attempt(array($field => $usernameinput, 'password' => $password), true)) { // ... }
Другой вариант заключается в том, чтобы расширить Illuminate\Auth\Guard
добавив требуемую функциональность и установив ее как компонент auth
в новом поставщике услуг.
Это можно сделать примерно так
$ field = Validator :: make (array ('email' => $ usernameinput, array ('email' => 'email')) -> pass ()? 'email': 'username'; if (Auth :: попытка (массив ($ field => $ usernameinput, 'password' => $ password), true)) { return Redirect :: предназначенный ('профиль'); }
Пользователи могут использовать поле электронной почты в качестве своего имени пользователя, и это может не совпадать с адресом электронной почты, который они использовали для поля электронной почты. Чтобы проверить подлинность дважды:
if (Auth::attempt(array( 'email' => Input::get('email_or_username'), 'password' => Input::get('password') )) || Auth::attempt(array( 'username' => Input::get('email_or_username'), 'password' => Input::get('password') ))) { // SUCCESS } else { // FAILURE }
Вот полное рабочее решение: (Протестировано с Laravel 5.3)
Просто добавьте этот метод (или мы можем сказать переопределить) в app \ Http \ Controllers \ Auth \ LoginController.php
public function login(Request $request) { $usernameinput = $request->input('email'); $password = $request->input('password'); $field = filter_var($usernameinput, FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; if (Auth::attempt([$field => $usernameinput, 'password' => $password])) { return redirect()->intended('/'); } else { return $this->sendFailedLoginResponse($request); } }