zoukankan      html  css  js  c++  java
  • 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); }
  • 相关阅读:
    AS3邮件
    JavaScript中this关键字使用方法详解
    AS3嵌入字体
    xp双击打不开jar包解决方案
    查询在表1表2中都存在,在表3中不存在的SQL(前提:表结构相同)
    这是否为复制Bug?求解!
    批处理添加允许弹出临时窗口站点
    SQL Server 合并IP
    C#学习笔记一(变量、属性、方法,构造函数)
    SQLServer事务的隔离级别
  • 原文地址:https://www.cnblogs.com/huaobin/p/14910223.html
Copyright © 2011-2022 走看看