ThinkPHP作为国内具有代表性的PHP框架,经过多年的发展,受到越来越多公司与开发者的青睐。我也在忙里偷闲中抽出部分时间,来学习这个优秀的框架。在开始学习这个框架时,最好通过实例来学习,更容易结合实际的生产情况,促进学习的效果;这里我就选择由ThinkPHP团队开发的基于ThinkPHP3.2的内容管理框架OneThink来学习,从了解它的执行流程→熟悉流程中各个细节→了解模版标签→自己实际去使用标签→再了解它的实际执行过程……通过这样一个流程来熟悉如何基于ThinkPHP开发出一套CMS系统。

  此为学习笔记开篇:(一)熟悉执行流程,跟着OneThink的首页内容生成的流程走,分析用户在访问一个URL之后,该程序是如何处理的,为后续的深入细节分析做铺垫。


  本地搭建OneThink环境,第一次访问先安装,成功后先简单的浏览一下该CMS的功能;前台(首页、列表页、文章页),后台(系统信息、内容发布审核、用户权限行为管理、系统设置、栏目管理、数据库备份、插件管理),都是些内容管理系统所具有的常规功能。

  访问网站首页index.php,跟着执行流程走一遍,细节不深究,碰到不太明白的变量,直接var_dump()输出看看:

  1. index.php——首页入口页面,版本判定、是否开启调试、引入ThinkPHP框架

      路径:'./index.php'

      判断PHP版本需是5.3.0以上:version_compare(PHP_VERSION,'5.3.0','<');

      系统调试设置:define('APP_DEBUG', true );

      应用目录设置:define ( 'APP_PATH', './Application/' );

      缓存目录设置:define ( 'RUNTIME_PATH', './Runtime/' );

      引入ThinkPHP:require './ThinkPHP/ThinkPHP.php';

  2. ThinkPHP.php——ThinkPHP框架的入口文件,定义各种常量、判断系统环境,初始化应用

      路径:'./ThinkPHP/ThinkPHP.php'

   定义常量:版本号THINK_VERSION、URL模式定义(4种模式)、类文件后缀EXT、是否为SAE环境、常用的系统路径常量(如Think类库目录、应用公共目录、缓存目录、配置目录等);

  引入核心类Think.class.php:require CORE_PATH.'Think'.EXT;

  应用初始化:Think\Think::start(); //命名空间\类名::方法();  //这里用到了命名空间

3. Think.class.php——框架的核心类,初始化应用程序,加载配置、类库,错误和异常处理,实例化对象

路径:'./ThinkPHP/Library/Think/Think.class.php'  声明:Think\Think

start()方法:加载需用的类、配置、语言包,是否需要缓存,运行应用

  ①设定方法:spl_autoload_register('Think\Think::autoload'); 自动加载类的方法,以及一些错误异常处理方法;

  ②分布式存储类初始化,用于读取、写入、删除文件;Storage::connect(STORAGE_TYPE);

  ③开发模式不缓存加载的核心类文件$runtimefile,用户模式将所有需引用的类并到同一个文件中缓存,加快后续访问速度。

  ④加载应用的配置文件、需要的函数和类文件、行文扩展等文件路径的数组$mode;include './ThinkPHP/Mode/common.php'

  ⑤循环加载处理$mode数组中的各路径的文件;

  ⑥检查应用目录结构是否存在,不存在则会默认生成目录结构;(这个针对ThinkPHP新建一个应用,首次访问时使用)

  ⑦开始运行应用 App::run();  即:'./ThinkPHP/Library/Think/App.class.php'

4. App.class.php——加载公共文件配置、URL解析、调用对应的控制器方法

  路径:'./ThinkPHP/Library/Think/App.class.php'  声明:Think\App

  run()方法:

    ①App::init();

    load_ext_file加载应用的公共文件(./Application/Common/Common/)配置(./Application/Common/Conf)

    Think\Dispatcher::dispatch();  URL解析,获取控制器index、方法index

    ②App::exec(); 执行应用程序,及新建控制器HomeConstroller的实例,即对象;

    创建控制器实例:$module  =  controller(CONTROLLER_NAME,CONTROLLER_PATH); 即=new IndexController();

    利用php反射机制获取action方法对象,$method =   new \ReflectionMethod($module, $action);

    执行这个方法:$method->invoke($module); //无参数时执行,访问首页默认执行这个

            $method->invokeArgs($module,$args); //有参数时执行;

    以上即执行了控制器 ./Application/Home/Controller/IndexController.class.php 中的index方法

5. IndexController.class.php——应用Home中默认首页index的控制器

    路径:./Application/Home/Controller/IndexController.class.php

    index()方法:          

        $category = D('Category')->getTree();   //调用Category模块(./Application/Home/Model/CategoryModel.class.php)中的getTree()方法,获取到站点栏目的数据;其中Category对应的是数据表名;
        $lists = D('Document')->lists(null); //和上面一样 调用DocumentModel.class.php中的lists()方法;

        $this->assign('category',$category);// 将栏目数组数据分配给 category标签

        $this->display(); //解析模版,输出;模版(./Application/Home/View/default/Index/index.html)

        这里利用了“模板继承”,请查看:

        http://document.onethink.cn/manual_1_0.html#onethink_3_8

  到此,访问该站点首页的流程就结束,其中后台admin.php和安装install.php的执行流程与之类似,这里就不做叙述了。其中用到一些直接调用的单个大写字母方法,都在这个公共函数文件中(./ThinkPHP/Common/functions.php)。


  最后提醒自己,学习是一个循序渐进的过程,需要一个时间积累,不可能一看就会;需要顺着这个流程多走几遍,再熟悉流程中的各个细节实现;加以大量的实际编码练习,才能真正的掌握!

  继续努力前进!

(一)熟悉执行流程——基于ThinkPHP3.2的内容管理框架OneThink学习的更多相关文章

  1. Django 基于类的视图(CBV)执行流程 CBV 源码分析

    一.CBV(基于类的视图) 视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码. 基本示例 D ...

  2. 3.3 Execution Flow of a DDD Based Application 基于DDD的应用程序执行流程

    3.3 Execution Flow of a DDD Based Application 基于DDD的应用程序执行流程 The figure below shows a typical reques ...

  3. 通过一个模拟程序让你明白WCF大致的执行流程

    原文http://www.cnblogs.com/artech/archive/2011/12/07/wcf-how-to-work.html 在<通过一个模拟程序让你明白ASP.NET MVC ...

  4. Mysql漂流系列(一):MySQL的执行流程

    MySQL的执行流程 MySQL的执行流程: MySQL的执行流程分析: 1.当我们请求mysql服务器的时候,MySQL前端会有一个监听,请求到了之后,服务器得到相关的SQL语句,执行之前(虚线部分 ...

  5. [源码分析] 带你梳理 Flink SQL / Table API内部执行流程

    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 目录 [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 0x01 Apac ...

  6. 口述完SpringMVC执行流程,面试官就让同事回家等消息了

    Srping MVC 执行流程真的是老生常谈的话题了,最近同事小刚出去面试,前面面试官相继问了几个 Spring 相关的问题,但当面试官问他,你知道 Srping MVC 的执行流程吗?小刚娴熟的巴拉 ...

  7. Tars | 第8篇 TarsJava Subset最终代码的执行流程与原理分析

    目录 前言 1. SubsetConf配置项的结构 1.1 SubsetConf 1.2 RatioConfig 1.3 KeyConfig 1.4 KeyRoute 1.5 SubsetConf的结 ...

  8. Netty学习(二)使用及执行流程

    Netty简单使用 1.本文先介绍一下 server 的 demo 2.(重点是这个)根据代码跟踪一下 Netty 的一些执行流程 和 事件传递的 pipeline. 首先到官网看一下Netty Se ...

  9. Spark SQL底层执行流程详解

    本文目录 一.Apache Spark 二.Spark SQL发展历程 三.Spark SQL底层执行原理 四.Catalyst 的两大优化 一.Apache Spark Apache Spark是用 ...

随机推荐

  1. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 8.全局防护盲点的总结下篇

    0x01 背景 现在的WEB应用对SQL注入的防护基本都是判断GPC是否开启,然后使用addlashes函数对单引号等特殊字符进行转义.但仅仅使用这样的防护是存在很多盲点的,接上篇http://www ...

  2. YYCache 设计思路

    iOS 开发中总会用到各种缓存,最初我是用的一些开源的缓存库,但到总觉得缺少某些功能,或某些 API 设计的不够好用.YYCache (https://github.com/ibireme/YYCac ...

  3. WPF 之 鼠标双击事件

    由于WPF中没有鼠标的双击事件,因而只能通过MouseDown事件来模拟.当连续的两次MouseDown事件的时间间隔,没有超过一个设定的时间阈值时,就计算为一个双击事件,并作相应的处理. 利用WPF ...

  4. Fliptile 开关问题 poj 3279

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4031   Accepted: 1539 Descript ...

  5. iOS 定位系统 知识

    最近在做考勤定位系统 总结一些定位系统的知识. 后期会出一份算法主要攻克地球坐标和火星坐标转换的 1.关于百度的火星坐标定位策略 地图SDK/定位SDK的定位策略: WIFI + 基站 +GPS 三者 ...

  6. 【Shell脚本学习15】shell printf命令:格式化输出语句

    printf 命令用于格式化输出, 是echo命令的增强版.它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同. 注意:printf 由 POSIX 标准所定义,移植性要比 ech ...

  7. 【Android 界面效果42】如何自定义字体

    项目里要统一用设计师的字体,android:typeface只支持系统三种字体.有什么比较好的做法? 你需要为整个应用替换自定义字体. 解决方案 1)Android默认方法 #1 你可以通过ID查找到 ...

  8. 【Mood-6】空气显示触摸屏、智能钱夹

    空气显示触摸屏 这款屏幕借助从设备中送出的空气和水在空中形成投影,可以用来展示计算机或平板中的图像.此外,它还可以实现人机互动.你只需在虚拟屏幕前挥动双手,就能完成一系列的隔空操作,如滑动.捏合.缩放 ...

  9. windws 安装jdk

    (1) 到官网下载好jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html (2 ...

  10. Oracle基础 数据泵导出/导入Expdp/impdp(转)

    一.EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2 ...