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 ...
随机推荐
- 为Oracle Clusterware修改公用及私有网络接口
出于种种原因我们可能需要为已安装的Oracle集群软件修改其使用的公用或私有网络所使用的网络接口(How to Change Interconnect/Public Interface IP or S ...
- 获取地址栏参数,json遍历
1. 获取地址栏参数 GetQueryString: function(name){ // 获取地址栏参数 var reg = new RegExp("(^|&)"+ na ...
- python_91_正则表达式
常用的正则表达式: '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r& ...
- jvm | 基于栈的解释器执行过程
一段简单的算术代码: public class Demo { public static void main(String[] args) { int a = 1; int b = 2; int c ...
- JQuery EasyUI学习记录(一)
1.主页设计(JQuery EasyUI插件) 下载easyUI开发包: 将easyUI资源文件导入页面中: <link rel="stylesheet" type=&quo ...
- shell脚本,awk利用NF来计算文本显示的行数。
解释: 1.awk 'NF{a++;print a,$0;next}1' file4 首先判断NF是否存在值,第一行第二行第三行第四行都存在,进行执行后面的输出,输出后碰到next后,就结束了后面的操 ...
- mysql 定时任务job
mysql 定时任务job 1.通过show EVENTS显示当前定义的事件 2.检查event_scheduler状态:SHOW VARIABLES LIKE 'event_scheduler' 3 ...
- 原型与原型继承demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【交互 细节题 思维题】cf1064E. Dwarves, Hats and Extrasensory Abilities
第一次做交互真有趣……:挺好的细节思维题 This is an interactive problem. In good old times dwarves tried to develop extr ...
- python爬虫用到的一些东西
原装requests >>> import requests >>> response = requests.get('http://www.baidu.com') ...