thinkphp架构
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp架构相关的知识,希望对你有一定的参考价值。
模块:
Common是一个特殊的公共模块,访问所有子模块之前都会首先加载Common模块配置文件( Conf/config.php )和公共函数文件( Common/function.php )。
但Common模块本身不能通过URL直接访问。
配置禁止访问的模块的方法:
‘MODULE_DENY_LIST‘ => array(‘Common‘,‘Runtime‘,‘Api‘)
配置允许访问的模块:
‘MODULE_ALLOW_LIST‘ => array(‘Home‘,‘Admin‘,‘User‘)
‘DEFAULT_MODULE‘ => ‘Home‘
只允许单模块访问:
‘MULTI_MODULE‘ => false
‘DEFAULT_MODULE‘ => ‘Home‘
URL标准访问:
http://serverName/index.php/模块/控制器/操作
绑定模块:
define(‘BIND_MODULE‘, ‘Home‘)
绑定控制器:
define(‘BIND_CONTROLLER‘,‘Index‘)
效果:
http://serverName/index.php/Home/Index/index => http://serverName/home.php/index
URL:
URL不区分大小写:
‘URL_CASE_INSENSITIVE‘ => true
默认URL访问设置:
DEFAULT_MODULE‘ => ‘Home‘, // 默认模块
‘DEFAULT_CONTROLLER‘ => ‘Index‘, // 默认控制器名称
‘DEFAULT_ACTION‘ => ‘index‘, // 默认操作名称
效果:
http://serverName/index.php => http://serverName/index.php/Home/Index/index
URL访问普通模式:
默认URL GET方法访问控制:
‘VAR_MODULE‘ => ‘m‘, // 默认模块获取变量
‘VAR_CONTROLLER‘ => ‘c‘, // 默认控制器获取变量
‘VAR_ACTION‘ => ‘a‘, // 默认操作获取变量
访问举例:
http://123.56.183.226/?m=Home&c=search&a=detail&case_id=1234
URL访问PATHINFO模式:
http://123.56.183.226/index.php/home/search/detail/3329061/
混合模式:
http://123.56.183.226/index.php/home/search/detail/?case_id=1234
pathinfo模式下支持对分隔符的设置:
‘URL_PATHINFO_DEPR‘=>‘-‘
(虽然这一条我实际测试出了点问题,但是大概是这个样子)
URL访问REWRITE模式:
如果是Apache则需要在入口文件的同级添加.htaccess文件,内容如下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
这样访问的时候不需要写index.php
URL访问兼容模式:
http://localhost/?s=/home/user/login/var/value
此类URL适用于特殊环境,当然也可以在配置文件中配置一些变量修改设置
Model:
多层MVC:think php支持多层MVC的设计,也就是把M层划分成Model、Logic、Service层。
使用D函数:
D(‘User‘) //实例化UserModel
D(‘User‘,‘Logic‘) //实例化UserLogic
D(‘User‘,‘Service‘) //实例化UserService
默认的M层是Model,当然这个也可以修改:
‘DEFAULT_M_LAYER‘ => ‘Logic‘, // 更改默认的模型层名称为Logic
更改之后,实例化的时候需要改成:
D(‘User‘) //实例化UserLogic
D(‘User‘,‘Model‘) //实例化UserModel
D(‘User‘,‘Service‘) //实例化UserService
D函数用来实例化M层
View:
图层由模板和模板引擎组成,在模板中可以直接使用PHP代码,模板引擎的设计会在后面讲述,通过驱
动也可以支持其他第三方的模板引擎。
‘DEFAULT_V_LAYER‘ => ‘Mobile‘, // 默认的视图层名称更改为Mobile
Controler:
ThinkPHP的控制器层由核心控制器和业务控制器组成。
核心控制器由系统内部的App类完成,负责应用(包括模块、控制器和操作)的调度控制,包括HTTP请求拦截和转发、加载配置等。
业务控制器则由用户定义的控制器类完成。
根据多层MVC的设计,控制器也可以设置为多层。
多层业务控制器的实现原理和模型的分层类似,例如业务控制器和事件控制器:
Controller/UserController //用于用户的业务逻辑控制和调度
Event/UserEvent //用于用户的事件响应操作
一般而言,我们知道,在配置文件中,有这样一项:
‘DEFAULT_C_LAYER‘ => ‘Controler‘, // 默认的控制器层
这样,在多层MVC中,C层只有Controler才能通过URL访问,其他的必须调用内部的A函数调用(也可以不用A函数)。
假设存在以下定义:
访问控制器 Home/Controller/UserController.class.php 定义如下:
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
}
事件控制器 Home/Event/UserEvent.class.php 定义如下:
namespace Home\Event;
use Think\Controller;
class UserEvent extends Controller{
}
UserControler是可以通过URL访问的,而UserEvent是不可以的。
UserEvent只可以内部调用:
A(‘User‘,‘Event‘);
CBD模式:
think php 引入的CBD的概念,核心Core+行为Behavior+驱动Driver架构。
从底层开始,框架就采用核心+行为+驱动的架构体系。
核心主要包括一些惯例配置文件和以class.php结尾的类;
驱动主要包括一些Driver库;
行为是具体的动作,行为的动作会在标签为被拦截下来做处理;
行为类的定义:
namespace Home\Behavior; class TestBehavior { //行为扩展的执行入口必须是run public function run(&$params){ if(C( ‘TEST_PARAM‘ )) { echo ‘RUNTEST BEHAVIOR ‘ .$params; } } } |
关于行为绑定请参考官方文档。
接下来介绍命名空间:
命名空间可以有效解决模块冲突的问题。
namespace Org\Util;
class File {
}
$class=new \Org\Util\File();
系统会自动加载 ThinkPHP/Library/Org/Util/File.class.php 文件。
Library目录下为根命名空间,只需给出类名就可以自动加载。
同时,Library目录下面可以实现命名空间自动加载。(不用use)
除了Library目录下面的命名空间之外,我们还可以注册其他的根命名空间,例如:
‘AUTOLOAD_NAMESPACE‘ => array(
‘My‘ => THINK_PATH.‘My‘,
‘One‘ => THINK_PATH.‘One‘)
类库映射:
命名类库映射相当于给类文件定义了一个别名,效率会比命名空间定位更高效,例如:
Think\Think::addMap(‘Think\Log‘,THINK_PATH.‘Think\Log.php‘);
Think\Think::addMap(‘Org\Util\Array‘,THINK_PATH.‘Org\Util\Array.php‘);
注意:类库映射key值不需要以\开头
自动加载的优先级:
1. 判断是否有注册了Test\MyClass类库映射,如果有则自动加载类库映射定义的文件;
2. 判断是否存在Library/Test目录,有则以该目录为初始目录加载;
3. 判断是否有注册Test根命名空间,有则以注册的目录为初始目录加载;
4. 如果以上都不成立,则以Test为模块目录进行初始目录加载;
然后以上面获取到的初始目录加载命名空间对应路径的文件;
本质上2、3都是根命名空间。所以可以认为,加载的顺序是类库映射、根命名空间最后才是当前模块
导入第三方类库:
命名规范、调用方法和前面的命名空间中介绍的差异不大。需要指出的是这里调用可能使用到import
函数、Vendor函数,而并非简单使用名字空间。
Web流程:
1. 用户URL请求
2. 调用应用入口文件(通常是网站的index.php)
3. 载入框架入口文件(ThinkPHP.php)
4. 记录初始运行时间和内存开销
5. 系统常量判断及定义
6. 载入框架引导类(Think\Think)并执行Think::start方法进行应用初始化
7. 设置错误处理机制和自动加载机制
8. 调用Think\Storage类进行存储初始化(由STORAGE_TYPE常量定义存储类型)
9. 部署模式下如果存在应用编译缓存文件则直接加载(直接跳转到步骤22)
10. 读取应用模式(由APP_MODE常量定义)的定义文件(以下以普通模式为例说明)
11. 加载当前应用模式定义的核心文件(普通模式是 ThinkPHP/Mode/common.php)
12. 加载惯例配置文件(普通模式是 ThinkPHP/Conf/convention.php)
13. 加载应用配置文件(普通模式是 Application/Common/Conf/config.php)
14. 加载系统别名定义
15. 判断并读取应用别名定义文件(普通模式是 Application/Common/Conf/alias.php)
16. 加载系统行为定义
17. 判断并读取应用行为定义文件(普通模式是 Application/Common/Conf/tags.php)
18. 加载框架底层语言包(普通模式是 ThinkPHP/Lang/zh-cn.php)
19. 如果是部署模式则生成应用编译缓存文件
20. 加载调试模式系统配置文件(ThinkPHP/Conf/debug.php)
21. 判断并读取应用的调试配置文件(默认是 Application/Common/Conf/debug.php)
22. 判断应用状态并读取状态配置文件(如果APP_STATUS常量定义不为空的话)
23. 检测应用目录结构并自动生成(如果CHECK_APP_DIR配置开启并且RUNTIME_PATH目录不存在的情
况下)
24. 调用Think\App类的run方法启动应用
25. 应用初始化(app_init)标签位侦听并执行绑定行为
26. 判断并加载动态配置和函数文件
27. 调用Think\Dispatcher::dispatch方法进行URL请求调度
28. 自动识别兼容URL模式和命令行模式下面的$_SERVER[‘PATH_INFO‘]参数
29. 检测域名部署以及完成模块和控制器的绑定操作(APP_SUB_DOMAIN_DEPLOY参数开启)
30. 分析URL地址中的PATH_INFO信息
31. 获取请求的模块信息
32. 检测模块是否存在和允许访问
33. 判断并加载模块配置文件、别名定义、行为定义及函数文件
34. 判断并加载模块的动态配置和函数文件
35. 模块的URL模式判断
36. 模块的路由检测(URL_ROUTER_ON开启)
37. PATH_INFO处理(path_info)标签位侦听并执行绑定行为
38. URL后缀检测(URL_DENY_SUFFIX以及URL_html_SUFFIX处理)
39. 获取当前控制器和操作,以及URL其他参数
40. URL请求调度完成(url_dispatch)标签位侦听并执行绑定行为
41. 应用开始(app_begin)标签位侦听并执行绑定行为
42. 调用SESSION_OPTIONS配置参数进行Session初始化(如果不是命令行模式)
43. 根据请求执行控制器方法
44. 如果控制器不存在则检测空控制器是否存在
45. 控制器开始(action_begin)标签位侦听并执行绑定行为
46. 默认调用系统的ReadHtmlCache行为读取静态缓存(HTML_CACHE_ON参数开启)
47. 判断并调用控制器的_initialize初始化方法
48. 判断操作方法是否存在,如果不存在则检测是否定义空操作方法
49. 判断前置操作方法是否定义,有的话执行
50. Action参数绑定检测,自动匹配操作方法的参数
51. 如果有模版渲染(调用控制器display方法)
52. 视图开始(view_begin)标签位侦听并执行绑定行为
53. 调用Think\View的fetch方法解析并获取模版内容
54. 自动识别当前主题以及定位模版文件
55. 视图解析(view_parse)标签位侦听并执行绑定行为
ThinkPHP3.2.3完全开发手册
本文档使用 看云 构建 - 46 -
56. 默认调用内置ParseTemplate行为解析模版(普通模式下面)
57. 模版引擎解析模版内容后生成模版缓存
58. 模版过滤替换(template_filter)标签位侦听并执行绑定行为
59. 默认调用系统的ContentReplace行为进行模版替换
60. 输出内容过滤(view_filter)标签位侦听并执行绑定行为
61. 默认调用系统的WriteHtmlCache行为写入静态缓存(HTML_CACHE_ON参数开启)
62. 调用Think\View类的render方法输出渲染内容
63. 视图结束(view_end)标签位侦听并执行绑定行为
64. 判断后置操作方法是否定义,有的话执行
65. 控制器结束(action_end)标签位侦听并执行绑定行为
66. 应用结束(app_end)标签位侦听并执行绑定行为
67. 执行系统的ShowPageTrace行为(SHOW_PAGE_TRACE参数开启并且不是AJAX请求)
68. 日志信息存储写入
以上是关于thinkphp架构的主要内容,如果未能解决你的问题,请参考以下文章