Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 08.03.2018 16:57:29

Delayed Jobs

Здравствуйте. Хочу сделать задержку в выполнении метода в контроллере. Мой код:

$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);

И не получилось. Кто знает как это реализовать правильно? Заранее спасибо.

Не в сети

#2 08.03.2018 17:04:32

Re: Delayed Jobs

Что не получилось?
Проверь QUEUE_DRIVER в .env

Не в сети

#3 08.03.2018 17:19:17

Re: Delayed Jobs

При выполнении этого метода в режиме debug появляется ошибка

FatalThrowableError in VoteController.php line 69: Fatal error: Call to a member function delay() on boolean

В .env файле выставлено

QUEUE_DRIVER=sync

Может быть для обновления записи в таблице нужно использовать другие команды?!

Не в сети

#4 08.03.2018 20:31:37

Re: Delayed Jobs

дружище, тебе надо обернуть эту операцию в 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

Не в сети

#5 09.03.2018 01:21:17

Re: Delayed Jobs

code_bright_anywhere, огромное спасибо. Это именно то, что нужно.

Не в сети

#6 09.03.2018 10:31:29

Re: Delayed Jobs

Butirator рад что смог помочь

я пишу  API для своего мобильного приложения, делюсь с миром через видео уроки https://www.youtube.com/watch?v=pUV_tVQlsBE&t=1s

Заходи, смотри, поддержи проект)


Пишу бэкенд для своего мобильного приложения, делюсь с миром, заходите посмотреть, много всего интересного https://youtu.be/C5M6-ycJ5gs

Не в сети

Подвал раздела