Я искал в интернете и до сих пор не нашел решение следующей проблемы …
В настоящее время у нас есть веб-сайт, разработанный с использованием Laravel, пользовательская таблица которого является удаленной базой данных Microsoft SQL. Водитель в config/auth.php
был установлен в «базу данных». Все работает нормально, кроме функции сброса пароля, в результате чего мы получаем следующую ошибку:
UnexpectedValueException in PasswordBroker.php line 238: User must implement CanResetPassword interface.
Из моего ограниченного понимания Laravel (это мой первый опыт работы с Laravel), драйвер Eloquent поддерживает функциональность CanResetPassword, однако это не было реализовано в провайдере базы данных пользователем Laravel, поэтому возникла ошибка.
Таким образом, мой вопрос, таким образом, есть ли у кого-нибудь конфигурация, в которой у него есть драйвер для «базы данных» и реализована функция сброса пароля? Все примеры, которые я до сих пор видел, касаются использования модели Eloquent, которая, насколько я понимаю, не подходит для Laravel, поскольку во время первоначальной разработки нам пришлось сменить драйвер с Eloquent на базу данных, чтобы заставить удаленный сервер Microsoft SQL работать в первое место. Я боюсь, что перенос базы данных Microsoft SQL в локальную базу данных — это не вариант.
В качестве альтернативы, если бы кто-нибудь реализовал другой метод сброса пользователем пароля с помощью адреса электронной почты, я был бы открыт для предложений.
Чтобы написать собственную логику сброса пароля, вы все равно можете использовать миграцию по умолчанию, которая поставляется из коробки, или просто создать свою. Самая важная часть — это токен. Поскольку вы делаете свой собственный сброс пароля, вам нужно принять пару решений:
Вам понадобится 2 страницы, 4 разных маршрута и 4 разные функции в одном контроллере. Страница «Я забыл свой пароль» и страница «Сброс пароля». На первой странице отобразите форму, где вы берете электронную почту пользователя. И пост к следующему контроллеру.
//to be added on top as use statements
use DB;
use Auth;
use Hash;
use Carbon;
use App\User;
public function sendPasswordResetToken(Request $request)
{
$user = User::where ('email', $request->email)-first();
if ( !$user ) return redirect()->back()->withErrors(['error' => '404']);
//create a new token to be sent to the user.
DB::table('password_resets')->insert([
'email' => $request->email,
'token' => str_random(60), //change 60 to any length you want
'created_at' => Carbon::now()
]);
$tokenData = DB::table('password_resets')
->where('email', $request->email)->first();
$token = $tokenData->token;
$email = $request->email; // or $email = $tokenData->email;
/**
* Send email to the email above with a link to your password reset
* something like url('password-reset/' . $token)
* Sending email varies according to your Laravel version. Very easy to implement
*/
}
Вторая часть, когда пользователь нажимает на ссылку
/**
* Assuming the URL looks like this
* http://localhost/password-reset/random-string-here
* You check if the user and the token exist and display a page
*/
public function showPasswordResetForm($token)
{
$tokenData = DB::table('password_resets')
->where('token', $token)->first();
if ( !$tokenData ) return redirect()->to('home'); //redirect them anywhere you want if the token does not exist.
return view('passwords.show');
}
Показать страницу с формой, содержащей 2 ввода
— Новый пароль password
или что вы хотите
— Подтверждение нового пароля password_confirm
или что ты хочешь
Форма должна публиковаться по тому же URL-адресу, сопоставленному со следующим контроллером. Зачем? потому что нам все еще нужно использовать токен, чтобы найти фактического пользователя.
public function resetPassword(Request $request, $token)
{
//some validation
...
$password = $request->password;
$tokenData = DB::table('password_resets')
->where('token', $token)->first();
$user = User::where('email', $tokenData->email)->first();
if ( !$user ) return redirect()->to('home'); //or wherever you want
$user->password = Hash::make($password);
$user->update(); //or $user->save();
//do we log the user directly or let them login and try their password for the first time ? if yes
Auth::login($user);
// If the user shouldn't reuse the token later, delete the token
DB::table('password_resets')->where('email', $user->email')->delete();
//redirect where we want according to whether they are logged in or not.
}
Не забудьте добавить маршруты
Route::get('password-reset', 'PasswordController@showForm'); //I did not create this controller. it simply displays a view with a form to take the email
Route::post('password-reset', 'PasswordController@sendPasswordResetToken');
Route::get('reset-password/{token}', 'PasswordController@showPasswordResetForm');
Route::post('reset-password/{token}', 'PasswordController@resetPassword');
Заметка: Возможны опечатки или синтаксические ошибки, потому что я не проверял это и писал здесь прямо из головы. Если вы видите ошибку / исключение, не паникуйте, прочитайте ошибку и выполните поиск в Google.
Других решений пока нет …