从作业处理程序调用Laravel控制器操作,并依赖注入

问题描述:

我有中间件将任务放入队列,并将$ 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

的解决方案是注入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