Я столкнулся с ошибкой, которую мне хотелось бы объяснить. У меня есть UserObserver, и каждый раз, когда пользователь обновляется и активное поле обновляется до истинного, генерируется новый пароль и отправляется приветственное электронное письмо.
функция выглядит следующим образом.
public function updated (User $user)
{
if ($user->active && $user->isDirty('active')) {
$password = generatePassword();
$user->password = bcrypt($password);
$user->save();
$user->notify(
new UserWelcomeNotification(
$user->email,
$password,
new MailResource(Email::getMailInfo(23))
)
);
}
}
Как вы можете видеть в операторе if, есть проверка, активен ли пользователь и было ли изменено поле базы данных (isDirty()). Если это правда, генерируется новый пароль, хешируется с помощью bcrypt и затем отправляется пользователю через уведомления. (mail)
Как и ожидалось, обновление пароля снова запускает метод, но теперь isDirty('active) должен возвращать false. Этого не происходит, он возвращает true на всех итерациях. После достижения максимального времени выполнения PHP я получаю следующую ошибку:
[Пятница, 11 января, 09:13:13 2019] PHP Fatal ошибка: превышено максимальное время выполнения
60 секунд в
app/src/vendor/laravel/framework/src/Illuminate/Hashing/BcryptHasher.php
После включения xdebug выдается следующее исключение. (как и ожидалось)
Ошибка PHP: достигнут максимальный уровень вложенности функций «256», прерывание!
в
/home/ilyas/script/ clockwork/app/src/vendor/laravel/framework/src/Illuminate/Support/Collection.php
в строке 1971
Из этой проблемы, которую можно легко решить, у меня есть 2 вопроса.
Почему bcrypt выдает ошибку после достижения максимального времени выполнения достигнуто?
Почему $user->isDirty('active') возвращает true после каждого обновления в этом цикле, хотя последнее обновление в наблюдателе не обновили активное поле?
По запросу Mozammil $user->getDirty() возвращает это при первом использовании обновленного метода сработало.
array(2) {
'active' =>
bool(true)
'updated_at' =>
string(19) "2019-01-11 11:27:13"
}
Со второго раза он возвращается до тех пор, пока не истечет время ожидания:
array(3) {
'password' =>
string(60) "$2y$10$rlAbpelKnT/yp5zFhXcjwelEKkDEx5SfNJWqL1LiDltRnHYBLINmK"
'active' =>
bool(true)
'updated_at' =>
string(19) "2019-01-11 11:27:13"
}
Подробнее здесь: https://stackoverflow.com/questions/541 ... crypt-erro
Laravel Observers - обновленные триггеры запускаются бесконечно и выдают ошибку bcrypt ⇐ Php
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Kotlin/Android Collectors/ Observers не находят никаких изменений за пределами класса
Anonymous » » в форуме Android - 0 Ответы
- 32 Просмотры
-
Последнее сообщение Anonymous
-