2016-05-23 64 views
2

我有中間件將任務放入隊列,並將$ actionName和GET/POST參數傳遞給Job構造函數。此代碼:從作業處理程序調用Laravel控制器操作,並依賴注入

$actionName = last(explode('@', $request->route()->getActionName())); 
$arguments = $request->query->all(); 
$job = new HandleApiRequest($actionName, $arguments); 
dispatch($job); 

,然後在工作處理程序,我想打電話控制器與方法傳遞的參數(在招聘構造初始化參數,不用擔心)。下面是一個代碼:

$data = app()->call(ApiController::class . '@' . $this->method, $this->arguments); 

的問題是,我不能叫控制器使用Request對象(照亮\ HTTP \請求)和它的服務。看起來像控制器走向無限循環,在它服務它只是空的。然後,我看到這個登錄控制檯從工人:

[Illuminate\Contracts\Container\BindingResolutionException]              
    Target [App\Http\Requests\Request] is not instantiable while building [App\Http\Controllers\Api\ApiController]. 

的問題是,我怎麼能在正確處理作業初始化請求對象?

謝謝!

+0

我不確定你會怎麼做,但你有沒有試過讓Laravel構建控制器併爲你處理? '$ controller = \ App :: Make(ApiController :: class); call_user_func([$ controller,$ this-> method],$ this-> arguments);'? – user3158900

+0

我試過了,但並沒有解決問題。無論如何,謝謝你的迴應:) – Bushikot

回答

2

的解決方案是注入Request對象爲處理方法,並與中間件傳遞的數據填充它:

class HandleApiRequest extends Job implements ShouldQueue 
{ 
    use InteractsWithQueue, SerializesModels; 

    private $method; 
    private $arguments; 

    public function __construct(string $method, array $arguments) 
    { 
     $this->method = $method; 
     $this->arguments = $arguments; 


    } 

    public function handle(ErrorService $error_service, Request $request) 
    { 
     /* 
     * Fill our empty request object with arguments passed by middleware. 
     * It's later will be used in controller and services. 
     */ 
     $request->query->add($this->arguments); 
     $data = app()->call(ApiController::class . '@' . $this->method); 

     //use $data here 
    } 

} 

希望這將是對別人有用,否則我將在稍後刪除整個主題。

+0

你能告訴你如何注入處理方法? Laravel的文檔非常缺乏,除了運行工匠命令外,他們幾乎沒有任何東西顯示出來。 – ShaneMit

+0

您可以在此示例中看到它。查看句柄函數參數:$ error_service和$ request with type-hints - 兩者都將自動解析並由框架注入。 – Bushikot

+0

對不起,但您的示例顯示了進入方法的參數,而不是ErrorService或Request對象如何或在哪裏(可能是類或函數示例)傳遞到handle()方法中。這是我很好奇的。 – ShaneMit