2016-05-19 30 views
3

我正在爲Laravel開發移動應用程序的API。從Laravel工作返回數據

方法將請求其它的API,合併和過濾數據,改變它的結構等

其中一個要求的應用程序是響應不超過30秒,或者沒有反應。所以,我必須儘可能多地重複請求。我想知道,有Laravel隊列,目前在我的作業類類似的東西:

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-> dispatch()只返回排隊的作業ID,而不是處理方法的結果。

TL; DR:如何從排隊的Job中返回數據,而不保存到任何地方,即使它有多個隊列嘗試?如果喬布斯不適合這個,也許有人知道其他方法。任何建議將被認真考慮。

在此先感謝!

回答

1

您正在返回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()時,響應將不會存在。但這就是異步工作的全部目的:)

+0

謝謝你的迴應!我需要以異步模式運行它,因爲否則在失敗的情況下Job不會重複。我試圖按照你的建議與getter,然後在循環中檢查getResponse(),但它不起作用(重試有其他ID?)。順便說一句,有可能從非排隊作業中返回值,而不使用getter:$ data = $ this-> dispatchNow($ job); – Bushikot

+2

在異步模式下,您將無法按定義返回值 - 因爲它將在一段時間後以異步模式運行。因此,您的工作必須將結果保存在某處,並且客戶端/控制器必須通過輪詢或實時流式傳輸(websockets,pubsub)再次請求。無論哪種方式,您都不能僅從異步作業返回結果 –