一、应用启动
在/thinkphp/start.php文件中,用一句代码App::run()->send();实现应用的启动。
// 执行应用
App::run()->send();
 
run()方法可以在/thinkphp/library/think/App.php文件中找到对应方法,这个方法是整个框架的核心方法,实现了路由转换、获取调度信息、根据调度信息执行相应模块控制器的方法、获取方法返回数据、将返回数据赋值给Response对象等一系列操作。
最后,调用返回的Response对象的send()方法将信息返回给客户端,一次完整的http请求就完成了。
 
二、应用调度分析
其中,第12~18步的路由分析和应用调度是框架从底层到应用跳转的核心部分,对URL进行路有分析,获取URL可以使用的调度类型,再根据调度类型,分别调用应用的对应逻辑业务实现。
第18步应用调度 $data = self::exec($dispatch, $config); 的源代码(thinkphp/library/think/App::exec())如下:
$dispatch['type']是App::run()中经过self::routeCheck()、Request::dispatch()后得到的。
 
$dispatch['type']为redirect时,执行重定向跳转Response::create();
$dispatch['type’]为module时,调用self::module();
$dispatch['type']为controller时,调用自动加载器Loader::action();
$dispatch['type']为method时,调用self::invokeMethod();
$dispatch['type']为function时,调用self::invokeFunction();
$dispatch['type']为response时,获取$dispatch['response'];
超出以上调度类型,直接抛出异常报错。
 
6种调度类型中,除redirect、controller、response,其余3种调度类型都是调用的App内的静态方法:
moudule——self::module()
method——self::invokeMethod()
function——self::invokeFunction()
3个静态方法的实现原理基本相同,依次为调用参数分析,反射回调相应方法。

ThinkPHP5.0源码学习之执行应用的更多相关文章

  1. ThinkPHP5.0源码学习之框架启动流程

    ThinkPHP5框架的启动流程图如下: ThinkPHP5的启动流程按照文件分为三步: 1.请求入口(public/index.php) 2.框架启动(thinkphp/start.php) 3.应 ...

  2. ThinkPHP5.0源码学习之缓存Cache(二)

    一.使用Cache类 TP5.0框架默认使用的是File文件缓存驱动,可以修改全局配置文件convention.php中的type,将其改为Redis,这样使用的就是Redis缓存驱动了.

  3. ThinkPHP5.0源码学习之缓存Cache(一)

    一.文件 1.缓存配置文件:thinkphp\convention.php 2.缓存文件:thinkphp\library\think\Cache.php 3.驱动目录:thinkphp\librar ...

  4. ThinkPHP5.0源码学习之注册自动加载

    ThinkPHP5框架的自动注册加载流程如下:

  5. ThinkPHP5.0源码学习之注册错误和异常处理机制

    在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册. // 注册错误和异常处理机制 \think\Error::register(); ...

  6. 【Spark2.0源码学习】-1.概述

          Spark作为当前主流的分布式计算框架,其高效性.通用性.易用性使其得到广泛的关注,本系列博客不会介绍其原理.安装与使用相关知识,将会从源码角度进行深度分析,理解其背后的设计精髓,以便后续 ...

  7. spark2.0源码学习

    [Spark2.0源码学习]-1.概述 [Spark2.0源码学习]-2.一切从脚本说起 [Spark2.0源码学习]-3.Endpoint模型介绍 [Spark2.0源码学习]-4.Master启动 ...

  8. Spring5.0源码学习系列之事务管理概述

    Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ...

  9. [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...

随机推荐

  1. python基础(12)-包的导入&异常处理

    包的导入 几种导入方式 import 包名 import time time.time() import 包名,包名 import time,sys time.time() sys.path from ...

  2. CookieUitl

    import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.h ...

  3. break,continue的区别

    break 终止循环, continue 跳出本次循环,进入下一次循环 username = 'Loker'passwd = '123456' for i in range(3): user = in ...

  4. Python requests库如何下载一个图片资源

    原文地址https://blog.csdn.net/u011541946/article/details/77700074 前面一篇文章介绍了response对象的一些常用API,也已经提到,我们的重 ...

  5. cocos2d-x JS 本地玩家位置跟服务器玩家位置转换相关

    //各种游戏人数情况下的本地位置配置mb.LOCAL_POS_LIST = { 2 : [0, 2], 3 : [0, 1, 3], 4 : [0, 1, 2, 3]}; /*------------ ...

  6. python_高级特征

    切片 Slice  : 取一个tuple的前三个元素,传统做法如下 : for i in range(3): dataList.append(testTuple[i]) if i == 2: prin ...

  7. Unity之流光效果

    效果如图: shader如下: Shader "Unlit/Walk light" { Properties { _MainTex ("Base (RGB), Alpha ...

  8. html5 javascript 表单练习案例

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  9. docker基本部署

    一.基本概念docker 1.镜像(Image) Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用 ...

  10. 提bug

    大多数公司都是用bugzilla来管理bug,也有的公司使用内部开发的bug管理平台.这里以bugzilla为例,我最不爽的是提bug的时候既要选择severity(严重级别)又要选择priority ...