从作业处理程序调用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].
的问题是,我怎么能在正确处理作业初始化请求对象?
谢谢!
答
的解决方案是注入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
}
}
希望这将是对别人有用,否则我将在稍后删除整个主题。
我不确定你会怎么做,但你有没有试过让Laravel构建控制器并为你处理? '$ controller = \ App :: Make(ApiController :: class); call_user_func([$ controller,$ this-> method],$ this-> arguments);'? – user3158900
我试过了,但并没有解决问题。无论如何,谢谢你的回应:) – Bushikot