2016-05-23 8 views
2

$ actionNameとGET/POSTパラメータをJobコンストラクタに渡してタスクをキューに入れるミドルウェアがあります。このコード:ジョブハンドラから、依存性注入を使用してLaravelコントローラアクションを呼び出す

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

そして、ジョブのハンドラでは、私は渡された引数(ジョブのコンストラクタで初期化された引数は、そのことについて心配しないでください)とコントローラメソッドを呼び出すしたいと思います。ここでは、コードされています、私はと呼ばれるコントローラと、それのサービスでRequestオブジェクト(を照らし\のHttp \要求)を使用しないことを

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

問題です。コントローラーのようなものが無限ループに向いているように見えますが、サービスではただ空です。それから私は、これは労働者からコンソールにログインするを参照してください。

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

の質問ですが、どのように私はきちんと仕事ハンドラでRequestオブジェクトを初期化することができますか?

ありがとう!

+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

関連する問題