Я столкнулся с ошибкой, которую мне хотелось бы объяснить. У меня есть 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
Кемеровские программисты php общаются здесь
1712883726
Anonymous
Я столкнулся с ошибкой, которую мне хотелось бы объяснить. У меня есть 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"
}
Подробнее здесь: [url]https://stackoverflow.com/questions/54144132/laravel-observers-updated-triggers-itself-endlessly-and-produces-a-bcrypt-erro[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия