码迷,mamicode.com
首页 > Web开发 > 详细

thinkphp架构

时间:2016-02-27 23:23:50      阅读:450      评论:0      收藏:0      [点我收藏+]

标签:

模块:

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架构

标签:

原文地址:http://www.cnblogs.com/toocooltohavefriends/p/5223750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!