Как получить jobId для Job в Laravel

*Создаю данный вопрос, ибо все которые я прочитал относятся либо к старым версиям ларавел, либо не отвечают как мне сделать это
Итак небольшие технические моменты перед самим кодом:

  1. Мой родительский контроллер использует трейт illuminate\Foundation\Bus\DispatchesJobs который позволяет вызывать $this->dispatch в контроллере
  2. Я вызываю $jobId = $this->dispatch(new MyJob()) (Судя по многим ресурсам при вызове жобы через трейт Bus он должен возвращать job id
  3. Логи по итогу показывают мне то, что мой $jobId = null :c
    Теперь о реализации: (буду выкладывать не полные подробности каждого класса, а только то, что кажется необходимым, но при необходимости дополню всеми недостающими материалами)

В соответствии с правильной реализацией при необходимости получить jobId вне жобы использую трейт

use Illuminate\Foundation\{
    Auth\Access\AuthorizesRequests,
    Bus\DispatchesJobs,
    Validation\ValidatesRequests
};

use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

После контроллер с трейтом наследуется контроллером в котором происходит сам вызов жобы

class Reports extends Controller
{
    public function build(Report $report, ReportQueue $reportQueue): Response
    {
        $jobId = null;

        if ($report->type_is_users) {
            $jobId = $this->dispatch(new BuildUsersReport($report, 1000000));
        }

По итогу выполнения данного кода логи показывают, что type_is_users = true, а $jobId остаётся null.
Сама жоба. начнём с того, что она тоже наследуется от абстрактного класса который имплементирует ShouldQueue и использует необходимые для жобы трейты

abstract class ExcelReport implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

И непосредственно сама жоба, но в ней по сути ничего сверхестественного и она довольно большая, поэтому закину сюда верхушку класса

final class BuildMessageRecipientsReport extends ExcelReport
{
    /** @var Message */
    private Message $message;

    public function __construct(Report $report, Message $message, int $sheetLineCount)
    {
        if (! $report->type_is_message_recipients) {
            throw new RuntimeException("Неверный тип отчета.");
        }

        parent::__construct($report, $sheetLineCount);

        $this->message = $message;
    }

    public function handle(

По итогу через horizon я отслеживаю, что жоба запускается, но при её запуске jobId остаётся пустым и я никак не могу сообразить что я делаю не так чтобы его получить. Запускается job через redis

Спустя несколько дней данный вопрос всё также актуален


Ответы (1 шт):

Автор решения: Vladislav

Всем доброго дня. Что-же, раз решения для меня не было дано, то спустя время я смог найти его сам.

Получим мы jobId или нет решается в файле конфигурации queue.php, а именно за счёт параметра after_commit в соединении вашей очереди.
false - получаем jobId
true - не получаем jobId

UPD: именно после этой правки следующая запись в моём вопросе начала работать:

if ($report->type_is_users) {
            $jobId = $this->dispatch(new BuildUsersReport($report, 1000000));
}

Но подмечу ещё момент, что это будет работать при вызове $this->dispatch из трейта DispatchesJobs, который должен использовать ваш контроллер

use Illuminate\Foundation\{
    Auth\Access\AuthorizesRequests,
    Bus\DispatchesJobs,
    Validation\ValidatesRequests
};

use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
→ Ссылка