Thinkphp5.1源码阅读
主要流程
1 \public\index.php
require __DIR__ . '/../thinkphp/start.php';
\thinkphp\start.php
require __DIR__ . '/base.php';
// 执行应用并响应
Container::get('app', [defined('APP_PATH') ? APP_PATH : ''])
->run()
->send();
2.1 \thinkphp\base.php
require __DIR__ . '/library/think/Loader.php';
// 注册自动加载
Loader::register();
// 注册核心类到容器
Container::getInstance()->bind([
'app' => App::class, //App::class ≈ string(9) "think\App"
//...
'view' => View::class,
//...
]);

3 \thinkphp\library\think\App.php
public function run()
{
// 初始化应用
$this->initialize(); //主要加载配置,助手函数
// 执行调度
$data = $dispatch->run(); //$dispatch = object(think\route\dispatch\Url)
//...
$response = Response::create(); //\thinkphp\library\think\Response.php
//...
return $response;
3.1 thinkphp\library\think\route\dispatch\Url.php
public function run()
{
// 解析默认的URL规则
$url = str_replace($this->param['depr'], '|', $this->dispatch);
$result = $this->parseUrl($url);
return (new Module($result))->run();
}
3.1.1 thinkphp\library\think\route\dispatch\Module.php
public function run()
{
// 实例化控制器
$instance = $this->app->controller( //thinkphp\library\think\App.php
//...
$call = [$instance, $action]; //$instance = object(app\user\controller\Home)
//...
return Container::getInstance()->invokeMethod($call, $vars);
3.2 \thinkphp\library\think\Response.php
public static function create($data = '', $type = '', $code = 200, array $header = [], $options = [])
{
//...
if (class_exists($class)) {
return new $class($data, $code, $header, $options);
} else {
return new static($data, $code, $header, $options);
}
}
//发送数据到客户端
public function send()
{
//...
echo $data;
控制器中 $this->fetch()
thinkphp\library\think\Controller.php
public function __construct()
{
$this->request = Container::get('request');
$this->app = Container::get('app');
$this->view = Container::get('view')->init(
$this->app['config']->pull('template'),
$this->app['config']->get('view_replace_str')
);
protected function fetch($template = '', $vars = [], $replace = [], $config = [])
{
return $this->view->fetch($template, $vars, $replace, $config);
}
thinkphp\library\think\View.php
public function init($engine = [], $replace = [])
{
// 初始化模板引擎
$this->engine($engine);
public function engine($options = [])
{
$type = !empty($options['type']) ? $options['type'] : 'Think';
$class = false !== strpos($type, '\\') ? $type : '\\think\\view\\driver\\' . ucfirst($type);
$this->engine = new $class($options); //$this->engine = thinkphp\library\think\view\driver\Think.php
return $this;
}
Thinkphp5.1源码阅读的更多相关文章
- thinkphp5.1 源码阅读
传送地址:https://github.com/cshaptx4869/tp5.1-code-read 包含: 自动加载 容器 配置文件 钩子 门面
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 【原】AFNetworking源码阅读(五)
[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 【原】AFNetworking源码阅读(二)
[原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...
随机推荐
- Python+selenium之疑难点解决之去除readonly的限制
去除文本框的readonly只读模式的限制 如图所示:去除卡号readonly限制 代码如图所示: js = 'document.getElementById("cardNo"). ...
- 洛谷 P2966 [USACO09DEC]牛收费路径Cow Toll Paths
题目描述 Like everyone else, FJ is always thinking up ways to increase his revenue. To this end, he has ...
- WPF中,DataGrid最左边多出一行的解决方案
这种情况下,请在DataGrid的属性里加上这个属性: RowHeaderWidth="0" 必须赋值为0,不能不赋值,也不能赋其他值. 问题解决.
- Android(java)学习笔记138:三重for循环的优化(Java面试题)
1. 首先我们看一段代码: for(int i=0;i<1000;i++){ for(int j=0;j<100;j++){ for(int k=0;k<10;k++){ testF ...
- CMDB 数据加密 最终整合API验证+AES数据加密
当CMDB运行在内网的时候,经过API验证的三关是没有问题的,但是如果运行在外网,有一个问题是,黑客截取后的访问速度比客户端快的时候还会造成数据泄露.为了解决这个问题,就要对数据进行加密 RSA加密 ...
- JsonPath 语法 与 XPath 对比
JsonPath 语法 与 XPath 对比 XPath JSONPath Description / $ the root object/element . @ the current obje ...
- WINDOWS-API:关于线程CreateThread,_beginthead(_beginthreadex),AfxBeginThread
[转]windows多线程编程CreateThread,_beginthead(_beginthreadex)和AfxBeginThread的区别 在Windows的多线程编程中,创建线程的函数主要有 ...
- iOS与JS相互传值与交互
JavaScriptCore是webkit的一个重要组成部分,主要是对JS进行解析和提供执行环境.iOS7后苹果在iPhone平台推出,极大的方便了我们对js的操作.我们可以脱离webview直接运行 ...
- Roman Numeral Converter-freecodecamp算法题目
Roman Numeral Converter 1.要求 将给定的数字转换成罗马数字 所有返回的罗马数字都应该是大写形式 2.思路 分别定义个位.十位.百位.千位的对应罗马数字的数组 用Math.fl ...
- Kenneth A.Lambert著的数据结构(用python语言描述)的第一章课后编程答案
第6题:工资部门将每个支付周期的雇员信息的列表保存到一个文本文件, 每一行的格式:<last name><hourly wage><hours worked> 编写 ...