Cómo obtener el ID de un Job en Laravel

Si has trabajado con las últimas versiones de laravel, te debes haber dado cuenta que cuando haces un dispatch de un job, este no retorna el ID del job, tal y como lo hacía en las versiones pasadas.

Pero tranquilo, hay 2 soluciones dependiendo de donde necesites obtener el ID.

Dentro del Job

La forma más simple de obtener el ID pero no siempre la más útil es a través del método getJobId() dentro de la variable job del trait InteractsWithQueue de la siguiente manera.

<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class MyJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; ... public function handle() { $id = $this->job->getJobId(); } }
Código para Obtener el ID dentro de la Clase Job

De esta forma se puede obtener el ID dentro de la clase del job permitiendo interactuar con la base de datos a través de este ID.

Cuando el Job es Despachado

Esta forma de obtener el ID de un job en laravel es la menos conocida, ya que no se muestra en la documentación principal y debes ir buscando dentro de los archivos que componen al framework para descubrir que la solución está en el uso del dispatcher del bus de laravel, tal y como se muestra en el siguiente código.

<?php namespace App\Services; use App\Jobs\MyJob; use Illuminate\Contracts\Bus\Dispatcher; class MyService { ... public function my_method() { $id = app(Dispatcher::class)->dispatch(new MyJob()); } }
Código para Obtener el ID a través del Dispatcher

Como puedes ver, esta no es una solución que encontrarías directamente pero que se vuelve lógica cuando sabemos cómo se compone el framework.