Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте. Хочу сделать задержку в выполнении метода в контроллере. Мой код:
$user->money = ( $site->double_rewards ) ? ( $site->reward_amount * 2 ) : $site->reward_amount + $user->money;
$user->save();
В документации приведен пример, что можно сделать так:
$job = (new SendReminderEmail($user))->delay(60 * 5);
$this->dispatch($job);
Далее я попробовал:
$user->money = ( $site->double_rewards ) ? ( $site->reward_amount * 2 ) : $site->reward_amount + $user->money;
$job = ($user->save())->delay(60 * 5);
$this->dispatch($job);
И не получилось. Кто знает как это реализовать правильно? Заранее спасибо.
Не в сети
Что не получилось?
Проверь QUEUE_DRIVER в .env
Не в сети
При выполнении этого метода в режиме debug появляется ошибка
FatalThrowableError in VoteController.php line 69: Fatal error: Call to a member function delay() on boolean
В .env файле выставлено
QUEUE_DRIVER=sync
Может быть для обновления записи в таблице нужно использовать другие команды?!
Не в сети
дружище, тебе надо обернуть эту операцию в Job.
php artisan make:job RewardUser
// RewardUser
public function handle()
{
$this->user->money = ( $this->site->double_rewards ) ? ( $this->site->reward_amount * 2 ) : $this->site->reward_amount + $this->user->money;
$this->user->save();
}
// в контроллере
...
$job = (new RewardUser($user, $site))->delay(60*5);
dispatch($job);
из дополнений не по теме, но по best practices: оберни операцию награждения юзера в читаемый метод в модели юзера
// App\User
public function reward($site)
{
$this->money = $site->double_rewards
? ( $site->reward_amount * 2 )
: $site->reward_amount + $this->money;
$this->save();
// тогда в Джобе в handle вызовешь
$user->reward($this->site); // красиво и понятно
}
а еще мне кажется у тебя в логике ошибка
когда $this->site->double_rewards возвращает true, ты тупо перезаписываешь поле money для юзера каждый раз, не прибавляя к нему текущее значение этого поля. но может так и нужно
А еще)
имей ввиду, что когда ты выполнишь этот код, он все равно будет выполняться без задержки, потому что у тебя queue_driver = sync. сконфигурируй какой-нить другой, самое простое - database
Изменено code_bright_anywhere (08.03.2018 20:36:18)
Пишу бэкенд для своего мобильного приложения, делюсь с миром, заходите посмотреть, много всего интересного https://youtu.be/C5M6-ycJ5gs
Не в сети
code_bright_anywhere, огромное спасибо. Это именно то, что нужно.
Не в сети
Butirator рад что смог помочь
я пишу API для своего мобильного приложения, делюсь с миром через видео уроки https://www.youtube.com/watch?v=pUV_tVQlsBE&t=1s
Заходи, смотри, поддержи проект)
Пишу бэкенд для своего мобильного приложения, делюсь с миром, заходите посмотреть, много всего интересного https://youtu.be/C5M6-ycJ5gs
Не в сети
Страницы 1