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 ) "