Я разрабатываю API на Laravel для мобильных приложений.
методы будет делать запросы к другим API, объединять и фильтровать данные, изменять их структуру и т. д.
Одно из требований к приложению — отвечать не более 30 секунд или не отвечать вообще. Итак, я должен повторять запросы столько, сколько у меня есть время. Я пытаюсь понять это с помощью Laravel Queues, и сейчас у меня есть что-то подобное в моем классе Job:
private $apiActionName;
public function __construct($apiActionName)
{
$this->apiActionName = $apiActionName;
}
public function handle(SomeService $someService)
{
return $someService->{$this->apiActionName}();
}
И этот код действия в контроллере:
public function someAction()
{
$data = $this->dispatch(new MyJob($apiActionName));
return response()->json($data);
}
Да, я знаю, что возвращать ценность с работы — плохая идея, но ожидайте, что это возможно. тем не мение $ This-> отправка () возвращает только идентификатор задания в очереди, а не результат справиться метод.
TL; DR: Как я могу вернуть данные из очереди Job, не сохраняя их нигде, и даже если в очереди более одной попытки? Может быть, кто-то знает другие способы, если Джобс не подходит для этого. Любой совет будет оценен.
Заранее спасибо!
Вы возвращаете данные в своем классе Job, но присваиваете $ data диспетчеру — обратите внимание, что метод dispatch () не является частью вашего класса Job.
Вы можете попробовать что-то вроде этого, предполагая, что ваши задания выполняются синхронно:
private $apiActionName;
private $response;
public function __construct($apiActionName)
{
$this->apiActionName = $apiActionName;
}
public function handle(SomeService $someService)
{
$this->response = $someService->{$this->apiActionName}();
}
public function getResponse()
{
return $this->response;
}
И тогда в вашем контроллере:
public function someAction()
{
$job = new MyJob($apiActionName);
$data = $this->dispatch($job);
return response()->json($job->getResponse());
}
Очевидно, что это не сработает, когда вы перейдете в асинхронный режим и очереди — ответ не будет там, когда вы вызовете getResponse (). Но это и есть цель асинхронных работ 🙂
Других решений пока нет …