После небольшого возни я смог ответить на свой вопрос. Да, это возможно; если задание отправляется через dispatchNow()
, свойство job
объекта Queueable будет иметь значение null, тогда как если оно отправляется по соединению с использованием dispatch()
, для него устанавливается реализация Illuminate \ Contracts \ Queue \ Job. Таким образом, метод дескриптора может быть изменен следующим образом:
public function handle()
{
foreach($this->account->pending_downloads as $file)
{
if(is_null($this->job)) {
DownloadFile::dispatchNow($file);
} else {
DownloadFile::dispatch($file);
}
}
}
И он будет работать как положено. Мне удалось найти это решение, создав новое задание:
<?php namespace App\Jobs;
class TestJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct()
{
}
public function handle()
{
dump(get_object_vars($this));
}
}
и отправив его в различные очереди и соединения, а также с помощью dispatchNow()
и наблюдая за выводом. Кроме того, можно восстановить соединение и поставить в очередь задание, отправленное с $this->job
:
public function handle()
{
echo $this->job->getConnectionName();
echo $this->job->getQueue();
}