Функция dispatch_sync
Функция dispatch_sync выполняет задание синхронно, то есть
немедленно в текущем процессе, без добавления в очередь.
Это полезно для тестирования, отладки или когда требуется
гарантированное выполнение задания до продолжения работы
скрипта. Функция принимает экземпляр класса задания
и возвращает результат его выполнения.
Синтаксис
<?php
dispatch_sync($job);
?>
Пример
Давайте создадим простое задание и выполним его синхронно:
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
class ProcessData implements ShouldQueue
{
protected $payload;
public function __construct($payload)
{
$this->payload = $payload;
}
public function handle()
{
return strtoupper($this->payload);
}
}
?>
<?php
namespace AppHttpControllers;
use AppJobsProcessData;
class ProcessController extends Controller
{
public function process()
{
$job = new ProcessData('abcde');
$res = dispatch_sync($job);
echo $res;
}
}
?>
Результат выполнения кода:
"ABCDE"
Пример
Давайте выполним задание, которое сохраняет данные в базу данных, и убедимся, что запись создана немедленно:
<?php
namespace AppJobs;
use AppModelsArticle;
use IlluminateContractsQueueShouldQueue;
class SaveArticle implements ShouldQueue
{
protected $data;
public function __construct($data)
{
$this->data = $data;
}
public function handle()
{
$article = Article::create([
'title' => $this->data['title'],
'text' => $this->data['text'],
]);
return $article;
}
}
?>
<?php
namespace AppHttpControllers;
use AppJobsSaveArticle;
class ArticleController extends Controller
{
public function store()
{
$data = [
'title' => 'article 1',
'text' => 'text 1',
];
$job = new SaveArticle($data);
$article = dispatch_sync($job);
echo $article->id;
}
}
?>
Результат выполнения кода:
"1"
Пример
Давайте обработаем ошибку, возникшую при синхронном выполнении задания:
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
class ValidateData implements ShouldQueue
{
protected $value;
public function __construct($value)
{
$this->value = $value;
}
public function handle()
{
if (empty($this->value)) {
throw new \Exception('Value is empty');
}
return true;
}
}
?>
<?php
namespace AppHttpControllers;
use AppJobsValidateData;
use IlluminateSupportFacadesLog;
class ValidateController extends Controller
{
public function validate()
{
try {
$job = new ValidateData('');
$res = dispatch_sync($job);
echo $res;
} catch (\Exception $e) {
Log::error($e->getMessage());
echo $e->getMessage();
}
}
}
?>
Результат выполнения кода:
"Value is empty"