Inyección de dependencia de colas de Laravel
Lo primero que debemos saber sobre las colas de Laravel es que la inyección de dependencia no puede ocurrir en el constructor y ocurre en el nivel del método de manejo.
Cuando el trabajo está siendo procesado por la cola, se invoca el método handle y podemos escribir dependencias de sugerencia en el método del trabajo y el contenedor de servicios de Laravel inyecta automáticamente estas dependencias.
Nota: Si desea controlar esto completamente, puede ir a App \ Providers \ AppServiceProvider, en el método de arranque, y usar el método bindMethod. BindMethod acepta una devolución de llamada que recibe el trabajo y el contenedor.
Dentro de esta devolución de llamada, puede invocar el método handle como desee.
use App\Jobs\MyJob; use App\Services\MyService; use App\Repositories\MyRepository;$this->app->bindMethod([MyJob::class, 'handle'], function ($job, $app) { return $job->handle( $app->make(MyService::class), $app->make(MyRepository::class), ... more classes ); });
La molestia de la inyección del mango
Cuando inyectamos las clases a través del método handle, no las definimos como propiedades de clase, por lo tanto, cuando las necesitemos en otras funciones dentro del Trabajo (considerando que se volverá sustancialmente complejo y grande y su lógica se dividirá en múltiples métodos) tendremos para pasarlos como parámetros a dichas funciones.
Y tengo una manera de evitar esto y mantener su código un poco más ordenado.
class MyJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; private something $data; private MyService $service; private MyRepo $repo; public function __construct(something $data) { $this->data = $data; } public function handle(MyService $service, MyRepo $repo) { $this->service = $service; $this->repo = $repo; } private function doStuff() { $stuff = $this->service->processStuff(); $this->repo->saveStuff($stuff); } }
Y de la misma manera, no necesitamos pasar nada como parámetros para cualquier cantidad de funciones que tenga.
Nota: He estado lidiando con trabajos con cientos de líneas últimamente y esto me ha estado molestando inicialmente, esto me ha ayudado, ¡así que espero que también te ayude a ti!