讲解一下源码中的中间件调度方法

来源: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]中的方法


0
1
梦里江山
小白的我标示:你说的我懂了,但是代码还是多少有疑惑。重点是这里:$response = call_user_func_array($call, [$request, $this->resolve($type), $param]);
2020-06-01
共1条回复

BAT资深工程师解析Tp5+Tp6底层源码

一门课掌握主流Tp5+最新Tp6框架底层,拥抱新潮流

686 学习 · 145 问题

查看课程