В Laravel 5.6 вам нужно сделать следующее.
Есть авторизация form - processes у LoginController, в моем случае я сменил емайл на имя, а пароль остался.
Если у такого пользователя такой пароль, то я его авторизую, а если у пользователя нет такого имени и пароля, то необходимо зарегистрироваться с введенными данными.
Вот класс LoginController
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
protected function redirectTo()
{
return '/';
}
public function username() {
return 'name';
}
/**
* Handle a failed authorization attempt.
*
* @return void
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
protected function sendFailedLoginResponse(Request $request)
{
// What you need to do to register a user
}
}
Я подумал переопределить sendFailedLoginResponse, чтобы зарегистрировать пользователя в тот момент. Запускаем как RegisterController и переносим данные из запроса POST.
Подскажите, как реализовать эту идею?
- Но у меня вопрос, а что, если у вас в логине опечатка? В этой задаче это не имеет значения. Просто если такого пользователя нет, то создаем. Думаю, такой подход будет плохим. Необходимо на уровне backend организовать регистрацию без редиректов.
Что ж, я вообще не против новых подходов. Но нужно учитывать влияние чего-то подобного. В некотором смысле вы могли бы указать пользователю, что у него нет учетной записи, если он просто забыл свой логин. В какой-то момент у вас обязательно появятся похожие пользователи, потому что они забыли свой первоначальный пароль, что, кстати, может быть безопаснее при использовании электронной почты. Но я понимаю, ты должен делать то, что тебе поручено. Позже я проведу тест на собственном приложении и дам вам знать.






1.) Открыть файл: Illuminate\Foundation\Auth\AuthenticateUsers.php
2.) Найдите способ: логин
3.) Отредактируйте возврат $this->sendFailedLoginResponse($request); в
return url('/register?username='.$request->username.'&password='.Hash::make($password));
Это самый простой способ, но не лучший. Лучше всего не отправлять пароль через get или не устанавливать где-то еще из базы данных.
Такая реализация на мой взгляд не совсем правильная. Я понял вот так
public function login(Request $request)
{
$this->validate($request, [
'name' => 'required|string',
'password' => 'required|string'
]);
$user = User::firstOrCreate([
'name' => $request->name
], [
'name' => $request->name,
'password' => Hash::make($request->password)
]);
if ($user && Hash::check($request->password, $user->password)) {
auth()->loginUsingId($user->id);
return redirect()->intended('/');
} else {
throw ValidationException::withMessages([
$this->username() => [trans('auth.failed')],
]);
}
}
Вы можете попробовать перенаправить пользователя на экран регистрации со всеми входными данными, которые он вам отправил, и назначить его там. Но я как-то подозрительно отношусь к системам, которые отправляют мои данные в то или иное место. Как правило, пароль пользователя не должен передаваться в системе. Это надо проверить и забыть. (Или сохранены и забыты). Но у меня вопрос, а что, если у вас в логине опечатка?