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 ...
随机推荐
- JAVA-Web05
1 HTTP协议特点 1)客户端->服务端(请求request)有三部份 a)请求行 b)请求头 c)请求的内容,如果没有,就是空白字符 2)服务端->客户端(响应respon ...
- 恢复为TrustedInstaller权限
每次我们要改动系统文件/文件夹时,都会被提示权限不够,而这个文件的所有者就是TrustInstaller.所以,就出现各种各样的教程,甚至傻瓜式的一键操作,让大家把自己设为文件的所有者,让自己得到最高 ...
- HDU 5090 Game with Pearls (贪心)
一道贪心的题,因为最小的不能由别的转化,所以每次贪心找最小的,其余的转化成大的. 从小到大,最小的如果不存在那么就break,否则减去一个,剩下的加k继续判断. #include<cstdio& ...
- mybatis(一):思维导图
- 徒手教你使用zookeeper编写服务发现
zookeeper是一个强一致[不严格]的分布式数据库,由多个节点共同组成一个分布式集群,挂掉任意一个节点,数据库仍然可以正常工作,客户端无感知故障切换.客户端向任意一个节点写入数据,其它节点可以立即 ...
- 实验十三 团队作业9:Beta冲刺与团队项目验收
实验十三 团队作业9:Beta冲刺与团队项目验收 实验时间 2019-6-20(21) Deadline: [6.20-6.26]之间任选连续3天的23:00,以团队随笔博文提交时间为准. 评分标准: ...
- Google 出品的 Java 编码规范,强烈推荐,权威又科学!
原文:google.github.io/styleguide/javaguide.html 译者:Hawstein 来源:hawstein.com/2014/01/20/google-java-sty ...
- Java删除开头和末尾字符串
//扩展2个String方法 /* * 删除开头字符串 */ public static String trimstart(String inStr, String prefix) { if (inS ...
- java基础—对象转型
一.对象转型介绍 对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型.转型的意思是:如把float类型转成int类型,把double类 ...
- MySQL左右连接查询中的NULL的数据筛选问题
这里使用左连接为例子,对于左连接是将左边表的数据显示,右边表中如果没有对应的数据则使用null填充. game表: game_type表: SELECT g.name,g.type_id,t.type ...