路由处理生成响应

index.php

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

//处理请求
$response = $kernel->handle(
    //请求实例的创建
    $request = Illuminate\Http\Request::capture()
);

  

\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php

    /**
     * Handle an incoming HTTP request.
     *处理一个http请求
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function handle($request)
    {
        try {
            //在请求过程中会添加CSRF保护,服务端会发送一个csrf令牌给客户端(cookie)
            $request->enableHttpMethodParameterOverride();
            //请求处理,通过路由传输请求实例
            $response = $this->sendRequestThroughRouter($request);
        } catch (Exception $e) {
            $this->reportException($e);

            $response = $this->renderException($request, $e);
        } catch (Throwable $e) {
            $this->reportException($e = new FatalThrowableError($e));

            $response = $this->renderException($request, $e);
        }

        $this->app['events']->dispatch(
            new Events\RequestHandled($request, $response)
        );

        return $response;
    }

  

    /**
     * Send the given request through the middleware / router.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    protected function sendRequestThroughRouter($request)
    {
        $this->app->instance('request', $request);

        Facade::clearResolvedInstance('request');

        //针对请求为应用程序'拔靴带' 执行bootstrap类的数组
        //在请求处理阶段共有7个环节,每一个环节由一个类来实现的
        //而且每个类都会有一个bootstrap()函数用于实现准备工作
        $this->bootstrap();

        return (new Pipeline($this->app))
                    ->send($request)
                    ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
                    ->then($this->dispatchToRouter());
    }

  

dispatchToRouter()

    /**
     * Get the route dispatcher callback.
     *设置路由分发回调函数
     * @return \Closure
     */
    protected function dispatchToRouter()
    {
        return function ($request) {
            $this->app->instance('request', $request);

            return $this->router->dispatch($request);
        };
    }

  

vendor\laravel\framework\src\Illuminate\Routing\Router.php

    /**
     * Dispatch the request to the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
     */
    public function dispatch(Request $request)
    {
        $this->currentRequest = $request;

        return $this->dispatchToRoute($request);
    }

  

//分发请求到指定路由并返回一个响应

    public function dispatchToRoute(Request $request)
    {
        return $this->runRoute($request, $this->findRoute($request));
    }

  

    protected function runRoute(Request $request, Route $route)
    {
        $request->setRouteResolver(function () use ($route) {
            return $route;
        });

        $this->events->dispatch(new Events\RouteMatched($route, $request));

        return $this->prepareResponse($request,
            $this->runRouteWithinStack($route, $request)
        );
    }

  

//通过实例栈启动给定的路由

 1     protected function runRouteWithinStack(Route $route, Request $request)
 2     {
 3         $shouldSkipMiddleware = $this->container->bound('middleware.disable') &&
 4                                 $this->container->make('middleware.disable') === true;
 5 
 6         $middleware = $shouldSkipMiddleware ? [] : $this->gatherRouteMiddleware($route);
 7 
 8         return (new Pipeline($this->container))
 9                         ->send($request)
10                         ->through($middleware)
11                         ->then(function ($request) use ($route) {
12                             return $this->prepareResponse(
13                                 $request, $route->run()
14                             );
15                         });
16     }

在路由信息存储实例中,通过“ $route = Sthis -> findRoute ( $request ) ; ”来查找请求对应的路由实例,

查找主要是根据请求的方法和请求 URI 来实现对应,当查找到请求对应的路由后,请求将会传递到对应的路由中去处理

,即’ " $route-> run ( $ request ) "

猜你喜欢

转载自www.cnblogs.com/sunlong88/p/9364679.html