thinkphp6-3

0x01 源码解析

1、public/index.php

// [ 应用入口文件 ] //定义根命名空间 namespace think; //引入composer require __DIR__ . '/../vendor/autoload.php'; //通过Ioc容器将HTTP类实例出来 // 执行HTTP应用并响应 $http = (new App())->http; //执行HTTP类中的run类方法 并返回一个response对象 $response = $http->run(); //执行response对象中的send类方法 该方法是处理并输出http状态码以及页面内容 $response->send(); //执行response对象中的send方法 $http->end($response);

2、通过ThinkApp容器获取到Http对象,然后再执行Http对象中的run方法

/** * 执行应用程序 * @access public * @param Request|null $request * @return Response */ public function run(Request $request = null): Response { //判断是否传入Request对象,如果没有则创建 $request = $request ?? $this->app->make('request', [], true); //将Request绑定到App容器内 $this->app->instance('request', $request); try { //runWithRequest方法 作用是执行应用程序 $response = $this->runWithRequest($request); } catch (Throwable $e) { //如果捕捉到Throwable异常 则执行reportException方法 //调用Handle::class实例中的report方法。收集异常信息 $this->reportException($e); //通过调用Handle::class实例中的render方法 //获取异常信息输出流 $response = $this->renderException($request, $e); } //return 内容 return $response; }

3、ThinkHttp->runWithRequest() 初始化应用程序,并执行

protected function runWithRequest(Request $request) { //初始化应用程序 $this->initialize(); // 加载全局中间件 $this->loadMiddleware(); // 设置开启事件机制 $this->app->event->withEvent($this->app->config->get('app.with_event', true)); // 监听HttpRun $this->app->event->trigger(HttpRun::class); //这里重点 return $this->app->middleware->pipeline() ->send($request) ->then(function ($request) { //通过dispatchToRoute方法加载路由 return $this->dispatchToRoute($request); }); }

4、ThinkHttp->dispatchToRoute()  

protected function dispatchToRoute($request) { //通过容器控制反转快速获取config类实例 //并获取配置文件中的with_route 判断是否加载路由 //如果加载则返回一个匿名函数。里面是路由文件内的设置 $withRoute = $this->app->config->get('app.with_route', true) ? function () { $this->loadRoutes(); } : null; //执行ThinkRoute类中的dispatch方法,并且将获取到的路由 //文件以及当前的Request实例传入到路由中,然后进行路由调度 return $this->app->route->dispatch($request, $withRoute); }
原文地址:https://www.cnblogs.com/huaobin/p/14910223.html