请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

/**
     * 中间件调度
     * @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方法,有个递归好想,没看懂

正在回答 回答被采纳积分+3

1回答

爱因诗贤 2020-06-01 15:51:51

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 16:34:35
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信