Задержка команды Laravel Artisan, поставленной в очередь из кода

Я запускаю команду Artisan из контроллера в моем приложении Laravel. Как указано в документации, Вы можете поставить в очередь, как это:

Artisan::queue('email:send', [
'user' => 1, '--queue' => 'default'
]);

Это заботится о логике очереди и, в моем случае, отправляет задание в Redis, где оно обрабатывается почти сразу.

Я хочу отложить работу. Вы обычно может сделать это при вызове команды очереди вот так:

$job = (new SendReminderEmail($user))->delay(60);

$this->dispatch($job);

Есть ли способ присоединиться к этим функциям, чтобы я мог отложить команду Artisan на 5 минут? Я предположил, что будет простой вариант отложить это.

Если нет, я мог бы создать другой класс Job, стоящий между моим контроллером и командой Artisan, который я мог бы поставить в очередь обычным способом и задержать, а затем заставил бы этот Job вызвать мою команду Artisan. Но это кажется действительно запутанным способом заставить это работать. Есть ли лучший способ отложить команду Artisan в очереди?

Спасибо

5

Решение

Поскольку ядро ​​консоли использует «push» для постановки команды в очередь, это невозможно для laravel 5.3 и более ранних версий.

Однако вы могли бы сделать запрос на получение фреймворка для реализации «более позднего» вызова ядра, который мог бы просто пройти через функцию «позже» очереди.

Или просто реализовать класс работы, как вы уже заявили.

Но есть лучшее решение для вашего варианта использования.
Просто используйте Почтовый фасад:

Mail::later(5, 'emails.welcome', $data, function ($message) {
//
});

Увидеть https://laravel.com/docs/5.2/mail#queueing-mail для документации.

1

Другие решения

Вы можете решить проблему, используя запланированное задание, которое будет отслеживать отправку писем в нужное время. Вы также можете использовать таблицу для установки переменных электронной почты, таких как тема, шаблон, шаблоны, время отправки сообщения и т. д.

0

По вопросам рекламы [email protected]