讲解一下源码中的中间件调度方法
来源:6-3 执行autoResponse调度
梦里江山
2020-05-24
/**
* 中间件调度
* @access public
* @param Request $request
* @param string $type 中间件类型
*/
public function dispatch(Request $request, $type = 'route')
{
return call_user_func($this->resolve($type), $request);
}
protected function resolve($type = 'route')
{
return function (Request $request) use ($type) {
$middleware = array_shift($this->queue[$type]);
if (null === $middleware) {
throw new InvalidArgumentException('The queue was exhausted, with no response returned');
}
list($call, $param) = $middleware;
try {
$response = call_user_func_array($call, [$request, $this->resolve($type), $param]);
} catch (HttpResponseException $exception) {
$response = $exception->getResponse();
}
if (!$response instanceof Response) {
throw new LogicException('The middleware must return Response instance');
}
return $response;
};
}
重点讲解一下resolve方法,有个递归好想,没看懂
写回答
1回答
-
爱因诗贤
2020-06-01
dispatch方法就相当于一个任务分发,call_user_func 函数就是将 $request 对象里面参数传到resolve返回的方法里面调用,这里默认的是 `route` 中间件,所以在外层不指定type 类型的时候,默认就是把 $request 参数送到 `路由(route)中间件的函数处理一下` ,这个$request 是通过依赖注入进来的,然后这个 `路由(route)中间件` 是在 $this->queue[$type] 里面一个个去执行的,$this->queue[$type]相当于一个中间件队列,你这里展示的应该只是一部分,其他地方肯定还有调用的地方去执行 $this->queue[$type]中的方法
012020-06-01
相似问题