1.基础
1.1目录结构
thinkphp框架目录
1.2入口文件
1.3系统常量
1.4自动生成
默认模板
自动生成
1.5模块设计
每个模块是相对独立的,其目录结构如下:
1.6控制器
1.7命名规范
2.配置
2018年3月26日记录
2.1数组配置方式
ThinkPHP框架中默认所有配置文件的定义格式均采用返回PHP数组的方式,格式为:
2.2配置方式ini
2.3配置方式xml
2.4配置方式yaml
2.5配置方式json
2.6配置加载
惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置->动态配置
后面的会覆盖之前的,配置的优先顺序是从右向左
2.7惯例配置
惯例配置文件:ThinkPHP/Conf/convention.php
相当于系统配置
2.8应用配置
公共模块的配置:Application/Common/Conf/config.php
应用配置文件也就是调用所有模块之前都会首先加载的公共配置文件
2.9模式配置
为应用模式(后面会有描述)单独定义配置文件
Application/Common/Conf/config_应用模式名称.php (仅在运行该模式下面才会加载)
2.10调试配置
如果开启调试模式的话,则会自动加载框架的调试配置文件(位于 ThinkPHP/Conf/debug.php )
和应用调试配置文件(位于 Application/Common/Conf/debug.php)
2.11状态配置
define('APP_STATUS','office');
那么就会自动加载该状态对应的配置文件(位于 Application/Common/Conf/office.php )
define('APP_STATUS','home');
那么就会自动加载该状态对应的配置文件(位于 Application/Common/Conf/home.php )。
2.12读取配置
C('参数名称')
$model = C('URL_MODEL');
// 由于配置参数不区分大小写,因此下面的写法是等效的
// $model = C('url_model');
// 如果my_config尚未设置的话,则返回default_config字符串
C('my_config',null,'default_config');
C函数读取二维配置
2.13动态配置
// 动态改变缓存有效期
C('DATA_CACHE_TIME',60);
// 获取已经设置的参数值
C('USER_CONFIG.USER_TYPE');
// 设置新的值
C('USER_CONFIG.USER_TYPE',1);
2.14扩展配置
扩展配置可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样。
扩展配置文件 user.php 和 db.php
// 加载扩展配置文件
'LOAD_EXT_CONFIG' => 'user,db',
user.php
//用户配置文件
return array(
'USER_TYPE' => 2, //用户类型
'USER_AUTH_ID' => 10, //用户认证ID
'USER_AUTH_TYPE' => 2, //用户认证模式
);
2.15批量配置
$config = array('WEB_SITE_TITLE'=>'ThinkPHP','WEB_SITE_DESCRIPTION'=>'开源PHP框架');
C($config);
2.16数据库配置
// 读取数据库中的配置(假设有一个config表用于保存配置参数)
$config = M('Config')->getField('name,value');
// config是一个关联数组 键值就是配置参数 值就是配置值
// 例如: array('config1'=>'val1','config2'=>'val2',...)
C($config); // 合并配置参数到全局配置
// 读取合并到全局配置中的数据库中的配置参数
C('CONFIG1');
// 动态改变配置参数(当前请求有效,不会自动保存到数据库)
C('CONFIG2','VALUE_NEW');
3.架构
3.1模块化设计
3.1.1模块化
通过网址http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...]
整体目录
应用目录
模块目录
3.1.2公共模块
Common模块是一个特殊的模块,是应用的公共模块,访问所有的模块之前都会首先加载公共模块下面的
配置文件( Conf/config.php )和公共函数文件( Common/function.php)。但Common模块本身不
能通过URL直接访问,公共模块的其他文件则可以被其他模块继承或者调用。
公共模块的位置可以通过COMMON_PATH常量改变,我们可以在入口文件中重新定义COMMON_PATH如下:
define('COMMON_PATH','./Common/');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
3.1.3自动生成模块模块目录
1.绑定模块
// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
2.访问
http://serverName/index.php
并且会默认生成index的控制器
3.生成多个控制器
// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
4.生成多个模型类
// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('BUILD_MODEL_LIST','User,Menu');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
5.可以采用build方法进行生成
// 生成Admin模块的Role控制器类
// 默认类库为Admin\Controller\RoleController
// 如果已经存在则不会重新生成
\Think\Build::buildController('Admin','Role');
// 生成Admin模块的Role模型类
// 默认类库为Admin\Model\RoleModel
// 如果已经存在则不会重新生成
\Think\Build::buildModel('Admin','Role');
3.1.4禁止访问模块
// 设置禁止访问的模块列表
'MODULE_DENY_LIST' => array('Common','Runtime','Api'),
3.1.5设置访问列表
'MODULE_ALLOW_LIST' => array('Home','Admin','User'),
'DEFAULT_MODULE' => 'Home',
3.1.6设置访问列表
'MODULE_ALLOW_LIST' => array('Home','Admin','User'),
'DEFAULT_MODULE' => 'Home',
3.1.7单模块设计
// 关闭多模块访问
'MULTI_MODULE' => false,
'DEFAULT_MODULE' => 'Home',
3.1.8多入口设计
1.在index.php的同级目录下新建一个admin.php
2.绑定admin模块
// 绑定Home模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
3.访问
原来的访问
http://serverName/index.php/Admin/Index/index
会变成
http://serverName/admin.php/Index/index
3.2URL模式
3.2.1大小写
'URL_CASE_INSENSITIVE' => true, 为true的时候为不区分
3.2.2URL模式
四种
3.2.3普通模式
http://localhost/?m=home&c=user&a=login&var=value
'VAR_MODULE' => 'module', // 默认模块获取变量
'VAR_CONTROLLER' => 'controller', // 默认控制器获取变量
'VAR_ACTION' => 'action', // 默认操作获取变量
3.2.4PATHINFO模式
http://localhost/index.php/home/user/login/var/value/
PATHINFO地址的前三个参数分别表示模块/控制器/操作。
// 更改PATHINFO参数分隔符
'URL_PATHINFO_DEPR'=>'-',
http://localhost/index.php/home-user-login-var-value
3.3多层MVC
3.3.1模型层
例如在某个项目设计中需要区分数据层、逻辑层、服务层等不同的模型层,我们可以在模块目录下面创建
Model 、 Logic 和 Service 目录,把对用户表的所有模型操作分成三层:
1. 数据层:Model/UserModel 用于定义数据相关的自动验证和自动完成和数据存取接口
2. 逻辑层:Logic/UserLogic 用于定义用户相关的业务逻辑
3. 服务层:Service/UserService 用于定义用户相关的服务接口等
而这三个模型操作类统一都继承Model类即可
实例:
数据层: Home/Model/UserModel.class.php
namespace Home\Model;
use Think\Model;
class UserModel extends Model{
}
逻辑层: Home/Logic/UserLogic.class.php
namespace Home\Logic;
use Think\Model;
class UserLogic extends Model{
}
服务层: Home/Service/UserService.class.php
namespace Home\Service;
use Think\Model;
class UserService extends Model{
}
D('User') //实例化UserModel
D('User','Logic') //实例化UserLogic
D('User','Service') //实例化UserService
默认的模型层是Model,我们也可以更改设置,例如:
'DEFAULT_M_LAYER' => 'Logic', // 更改默认的模型层名称为Logic
更改之后,实例化的时候需要改成:
D('User') //实例化UserLogic
D('User','Model') //实例化UserModel
D('User','Service') //实例化UserService
3.3.2视图层
视图层由模板和模板引擎组成,在模板中可以直接使用PHP代码,模板引擎的设计会在后面讲述,通过驱
动也可以支持其他第三方的模板引擎。视图的多层可以简单的通过目录(也就是模板主题)区分,例如:
View/default/User/add.html
View/blue/User/add.html
复杂一点的多层视图还可以更进一步,采用不同的视图目录来完成,例如:
view 普通视图层目录
mobile 手机端访问视图层目录
默认模板
默认的视图层是View目录,我们可以调整设置如下:
'DEFAULT_V_LAYER' => 'Mobile', // 默认的视图层名称更改为Mobile
非默认视图层目录的模板获取需要使用T函数,后面会讲到。
3.3.3控制器
ThinkPHP的控制器层由核心控制器和业务控制器组成,核心控制器由系统内部的App类完成,负责应用
(包括模块、控制器和操作)的调度控制,包括HTTP请求拦截和转发、加载配置等。业务控制器则由用户
定义的控制器类完成。多层业务控制器的实现原理和模型的分层类似,例如业务控制器和事件控制器:
Controller/UserController //用于用户的业务逻辑控制和调度
Event/UserEvent //用于用户的事件响应操作
访问控制器 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{
}
UserController负责外部交互响应,通过URL请求响应,例如 http://serverName/User/index ,而
本文档使用 看云 构建 - 31 -UserEvent 负责内部的事件响应,并且只能在内部调用:
A('User','Event');
默认的访问控制器层是Controller,我们可以调整设置如下:
'DEFAULT_C_LAYER' => 'Event', // 默认的控制器层名称改为Event
3.4CBD模式
3.4.1架构
ThinkPHP引入了全新的CBD(核心Core+行为Behavior+驱动Driver)架构模式
3.4.2Core
ThinkPHP的核心部分包括核心函数库、惯例配置、核心类库(包括基础类和内置驱动及核心行为)
ThinkPHP/Common/functions.php // 核心函数库
ThinkPHP/Conf/convention.php // 惯例配置文件
ThinkPHP/Conf/debug.php // 惯例调试配置文件
ThinkPHP/Mode/common.php // 普通模式定义文件
ThinkPHP/Library/Think // 核心类库包
ThinkPHP/Library/Behavior // 系统行为类库
ThinkPHP/Library/Think/App.class.php // 核心应用类
ThinkPHP/Library/Think/Cache.class.php // 核心缓存类
ThinkPHP/Library/Think/Controller.class.php // 基础控制器类
ThinkPHP/Library/Think/Db.class.php // 数据库操作类
ThinkPHP/Library/Think/Dispatcher.class.php // URL解析调度类
ThinkPHP/Library/Think/Exception.class.php // 系统基础异常类
ThinkPHP/Library/Think/Hook.class.php // 系统钩子类
ThinkPHP/Library/Think/Log.class.php // 系统日志记录类
ThinkPHP/Library/Think/Model.class.php // 系统基础模型类
ThinkPHP/Library/Think/Route.class.php // 系统路由类
ThinkPHP/Library/Think/Storage.class.php // 系统存储类
ThinkPHP/Library/Think/Template.class.php // 内置模板引擎类
ThinkPHP/Library/Think/Think.class.php // 系统引导类
ThinkPHP/Library/Think/View.class.php // 系统视图类
3.4.3Driver
在架构设计上更加强化了驱动的设计,替代了之前的引擎和模式扩展,并且改进了行为的设计,使
得框架整体更加灵活,并且由于在需要写入数据的功能类库中都采用了驱动化的设计思想,所以使得新的
框架能够轻松满足分布式部署的需求,对云平台的支持可以更简单的实现了。
驱动包括
ThinkPHP/Library/Think/Cache/Driver // 缓存驱动类库
ThinkPHP/Library/Think/Db/Driver // 数据库驱动类库
ThinkPHP/Library/Think/Log/Driver // 日志记录驱动类库
ThinkPHP/Library/Think/Session/Driver // Session驱动类库
ThinkPHP/Library/Think/Storage/Driver // 存储驱动类库
ThinkPHP/Library/Think/Template/Driver // 第三方模板引擎驱动类库
ThinkPHP/Library/Think/Template/TagLib // 内置模板引擎标签库扩展类库
3.4.4Behavior
行为(Behavior)是ThinkPHP扩展机制中比较关键的一项扩展,行为既可以独立调用,也可以绑定到某
个标签(位)中进行侦听。
3.4.5系统标签位
系统核心提供的标签位置包括(按照执行顺序排列):
app_init 应用初始化标签位
module_check 模块检测标签位(3.2.1版本新增)
path_info PATH_INFO检测标签位
app_begin 应用开始标签位
action_name 操作方法名标签位
action_begin 控制器开始标签位
view_begin 视图输出开始标签位
view_template 视图模板解析标签位
view_parse 视图解析标签位
template_filter 模板解析过滤标签位
view_filter 视图输出过滤标签位
view_end 视图输出结束标签位
action_end 控制器结束标签位
app_end 应用结束标签位
开发人员还可以在应用中添加自己的应用标签,在任何需要拦截的位置添加
如下代码即可:
// 添加my_tag 标签侦听
\Think\Hook::listen('my_tag');
方法第一个参数是要侦听的标签位,除此之外还可以传入并且只接受一个参数,如果需要传入多个参数,
请使用数组。
// 添加my_tag 标签侦听
\Think\Hook::listen('my_tag',$params);
3.4.6核心行为
核心行为位于 ThinkPHP/Behavior/ 目录下面,框架核心内置的行为包括如下:
3.4.7行为定义
自定义的扩展行为可以放在核心或者应用目录,只要遵循命名空间的定义规则即可。
行为类的命名采用:
行为名称(驼峰法,首字母大写)+Behavior
行为类的定义方式如下:
namespace Home\Behavior;
class TestBehavior {
// 行为扩展的执行入口必须是run
public function run(&$params){
if(C('TEST_PARAM')) {
echo 'RUNTEST BEHAVIOR '.$params;
}
}
}
行为类必须定义执行入口方法 run ,由于行为的调用机制影响,run方法不需要任何返回值,所有返回都通
过引用返回。
3.4.8行为绑定
行为定义好后需要绑定标签
我们需要在应用的行为定义文件 tags.php 文件中进行行为和标签的位置定义,格式如下:
return array(
'标签名称1'=>array('行为名1','行为名2',...),
'标签名称2'=>array('行为名1','行为名2',...),
);
标签名称包括我们前面列出的系统标签和应用中自己定义的标签名称,比如你需要在app_init标签位置定
义一个 CheckLangBehavior 行为类的话,可以使用:
return array(
'app_init'=>array('Home\Behavior\CheckLangBehavior'),
);
可以给一个标签位定义多个行为,行为的执行顺序就是定义的先后顺序,例如:
return array(
'app_init'=>array(
'Home\Behavior\CheckLangBehavior',
'Home\Behavior\CronRunBehavior'
),
);
读取顺序
默认情况下tags.php中定义的行为会并入系统行为一起执行,也就是说如果系统的行为定义中app_init标
签中已经定义了其他行为,则会首先执行系统行为扩展中定义的行为,然后再执行项目行为中定义的行
为。例如: 系统行为定义文件中定义了:
'app_begin' => array(
'Behavior\ReadHtmlCacheBehavior', // 读取静态缓存
),
而应用行为定义文件有定义:
'app_begin' => array(
'Home\Behavior\CheckModuleBehavior',
'Home\Behavior\CheckLangBehavior',
),
则最终执行到app_begin标签(位)的时候,会依次执行:
Library\Behavior\ReadHtmlCacheBehavior
Home\Behavior\CheckModuleBehavior
Home\Behavior\CheckLangBehavior
覆盖操作
如果希望应用的行为配置文件中的定义覆盖系统的行为定义,可以改为为如下方式:
'app_begin' => array(
'Home\Behavior\CheckModuleBehavior',
'Home\Behavior\CheckLangBehavior',
'_overlay' => true,
),
3.4.9单独执行
行为的调用不一定要放到标签才能调用,如果需要的话,我们可以在控制器中或者其他地方直接调用行
为。例如,我们可以把用户权限检测封装成一个行为类,例如:
namespace Home\Behavior;
use Think\Behavior;
class AuthCheckBehavior extends Behavior {
// 行为扩展的执行入口必须是run
public function run(&$return){
if(C('USER_AUTH_ON')) {
// 进行权限认证逻辑 如果认证通过 $return = true;
// 否则用halt输出错误信息
}
}
}
定义了AuthCheck行为后,我们可以在控制器的_initialize方法中直接用下面的方式调用:
B('Home\Behavior\AuthCheck');
3.5命名空间
3.5.1简述
namespace Org\Util;
class File {
}
其所在的路径是 ThinkPHP/Library/Org/Util/File.class.php ,因此,如果我们实例化该类的话:
$class = new \Org\Util\File();
系统会自动加载 ThinkPHP/Library/Org/Util/File.class.php 文件
3.5.2根命名空间
例如,我们在Library目录下面新增一个My根命名空间目录,然后定义一个Test类如下:
namespace My;
class Test {
public function sayHello(){
echo 'hello';
}
}
Test类保存在 ThinkPHP/Library/My/Test.class.php ,我们就可以直接实例化和调用:
$Test = new \My\Test();
$Test->sayHello();
3.6自动加载
3.6.1新的自动加载
'AUTOLOAD_NAMESPACE' => array(
'My' => THINK_PATH.'My',
'One' => THINK_PATH.'One',
)
配置了上面的 AUTOLOAD_NAMESPACE 后,如果我们实例化下面的类库
new \My\Net\IpLocation();
new \One\Util\Log();
会自动加载对应的类库文件
ThinkPHP/My/Net/IpLocation.class.php
ThinkPHP/One/Util/Log.class.php
3.6.2类库映射
命名类库映射相当于给类文件定义了一个别名,效率会比命名空间定位更高效,例如:
Think\Think::addMap('Think\Log',THINK_PATH.'Think\Log.php');
Think\Think::addMap('Org\Util\Array',THINK_PATH.'Org\Util\Array.php');
注意:添加类库映射的时候不需要写类库开头的"\"
也可以利用addMap方法批量导入类库映射定义,例如:
$map = array('Think\Log'=>THINK_PATH.'Think\Log.php','Org\Util\Array'=>THINK_PATH.'Org\Util\Ar
ray.php');
Think\Think::addMap($map);
当然,比较方便的方式是我们可以在模块配置目录下面创建alias.php文件用于定义类库映射,该文件会自
动加载,定义方式如下:
return array(
'Think\Log' => THINK_PATH.'Think\Log.php',
'Org\Util\Array' => THINK_PATH.'Org\Util\Array.php'
);
3.6.3自动加载的优先级
1. 判断是否有注册了Test\MyClass类库映射,如果有则自动加载类库映射定义的文件;
2. 判断是否存在Library/Test目录,有则以该目录为初始目录加载;
3. 判断是否有注册Test根命名空间,有则以注册的目录为初始目录加载;
4. 如果以上都不成立,则以Test为模块目录进行初始目录加载;
3.6.4手动加载
各种方式加载
// 导入Org类库包 Library/Org/Util/Date.class.php类库
import("Org.Util.Date");
// 导入Home模块下面的 Application/Home/Util/UserUtil.class.php类库
import("Home.Util.UserUtil");
// 导入当前模块下面的类库
import("@.Util.Array");
// 导入Vendor类库包 Library/Vendor/Zend/Server.class.php
import('Vendor.Zend.Server');
如果你在Library目录下面创建了一
个Test子目录,并且创建了一个UserTest.class.php类库,那么可以这样导入:
import('Test.UserTest');
其他的就认为是应用类库导入。
注意,如果你的类库没有使用命名空间定义的话,实例化的时候需要加上根命名空间,例如:
import('Test.UserTest');
$test = new \UserTest();
当前文件目录的
例如,要导入当前文件所在目录下面的
RBAC/AccessDecisionManager.class.php 文件,可以使用:
import("RBAC.AccessDecisionManager",dirname(__FILE__));
如果你要导入的类库文件名的后缀不是class.php而是php,那么可以使用import方法的第三个参数指定后缀:
import("RBAC.AccessDecisionManager",dirname(__FILE__),".php");
导入点号
名字中如果有三个或者三个以上的.的说话,就采用#的方式
按照系统的规则,import方法是无法导入具有点号的类库文件的,因为点号会直接转化成斜线,例如我们
定义了一个名称为User.Info.class.php 的文件的话,采用:
import("Org.User.Info");
方式加载的话就会出现错误,导致加载的文件不是Org/User.Info.class.php 文件,而是
Org/User/Info.class.php 文件,这种情况下,我们可以使用:
import("Org.User#Info");
3.7应用模式
默认情况下的应用模式是普通模式(common),如果要采用其他的应用模式(当然,前提是已经有定
义),必须在入口文件中定义,设置 APP_MODE 常量即可,例如:
// 定义存储类型和应用模式为SAE(用于支持SAE平台)
define('STORAGE_TYPE','sae');
define('APP_MODE','sae');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
3.8项目编译
3.8.1应用编译缓存
编译缓存的基础原理是第一次运行的时候把核心需要加载的文件去掉空白和注释后合并到一个文件中,第
二次运行的时候就直接载入编译缓存而无需载入众多的核心文件。当第二次执行的时候就会根据当前的应
用模式直接载入编译过的缓存文件,从而省去很多IO开销,加快执行速度。
例子:
编译缓存文件默认生成在应用目录的Runtime目录下面,我们可以在Application/Runtime目录下面看到
有一个 common~runtime.php 文件,这个就是普通模式的编译缓存文件。如果你当前运行在其他的应用
模式下面,那么编译缓存文件就是: 应用模式名~runtime.php
ThinkPHP3.2.3完全开发手册
本文档使用 看云 构建 - 44 -例如,如果你当前用的是SAE模式,那么生成的编译缓存文件则会变成 sae~runtime.php 。
普通模式的编译缓存的内容包括:系统函数库、系统基础核心类库、核心行为类库、项目函数文件,当
然这些是可以改变的。
3.8.2运行Lite文件
运行Lite文件的作用是替换框架的入口文件或者替换应用入口文件,提高运行效率。因为默认生成的文件
名为lite.php,并且是运行时动态生成,因此称之为运行Lite文件。
Lite文件的特点包括:
运行时动态生成;
常量定义为针对当前环境;
支持定义需要编译的文件列表;
支持生成Lite文件的名称;
3.9系统流程
ThinkPHP框架开发的应用的标准执行流程如下:
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)
ThinkPHP3.2.3完全开发手册
本文档使用 看云 构建 - 45 -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. 日志信息存储写入
4.路由
4.1简介
ThinkPHP的路由功能包括:
正则路由
规则路由
静态路由(URL映射)
闭包支持
开启路由
// 开启路由
'URL_ROUTER_ON' => true,
路由规则
'URL_ROUTE_RULES'=>array(
'news/:year/:month/:day' => array('News/archive', 'status=1'),
'news/:id' => 'News/read',
'news/read/:id' => '/news/:1',
),
4.2路由定义
路由规则的定义格式为: '路由表达式'=>'路由地址和传入参数'
或者:array('路由表达式','路由地址','传入参数')
模块路由和全局路由配置的区别在于,全局路由的路由地址必须包含模块。
路由表达式
路由表达式包括规则路由和正则路由的定义表达式,只能使用字符串
---------------------
作者:乐乐
来源:CSDN
版权声明:本文为博主原创文章,转载请附上博文链接!