thinkphp 现在流行的两个版本:TP3.1,TP3.2。
两个版本在行为扩展方面采用不同的表现形式。其中TP3.2引入了钩子插件的形式,可以定义插件控制器;TP3.1采用的是tag('app_begin')
;
以下是3.1的行为扩展:
一:执行流程:PHP程序以顺序的方式执行,每点击一个连接,将从入口文件或起始文件执行。
(1):文件流程: 【1】/index.php入口文件–>
【2】/ThinkPHP/ThinkPHP.php–>
【3】/ThinkPHP/Common/runtime.php—>
【4】/ThinkPHP/Core/Think.class.php::start();–>
【5】/ThinkPHP/Core/App.class.php::run();
一次执行的大体流程在执行完run()方法就结束了。
(2):代码流程
看一下run方法的具体内容:
/**
* 运行应用实例 入口文件使用的快捷方法
* @access public
* @return void
*/
static public function run() {
// 项目初始化标签
tag('app_init');
App::init();
// 项目开始标签
tag('app_begin');
// Session初始化
session(C('SESSION_OPTIONS'));
// 记录应用初始化时间
G('initTime');
App::exec();
// 项目结束标签
tag('app_end');
return ;
}
这里我们看到多次调用了同一个方法:tag();这个tag方法就是用来执行行为扩展(处理标签扩展)的。在tag方法中有几个地方值得看一下:
// 系统标签扩展
$extends = C('extends.' . $tag);
// 应用标签扩展
$tags = C('tags.' . $tag);
这段代码用户读取在配置文件中我们定义的扩展和系统内置的一些行为(如:路由检测,读取静态缓存,自动定位模板…),这样我们在tags.php配置文件中定义的行为扩展才会有用;
B($name, $params);//执行扩展
这才是真正的关键:看一下function B就明白了:
/**
* 执行某个行为
* @param string $name 行为名称
* @param Mixed $params 传人的参数
* @return void
*/
function B($name, &$params=NULL) {
$class = $name.'Behavior';
if(APP_DEBUG) {
G('behaviorStart');
}
$behavior = new $class();
$behavior->run($params);
if(APP_DEBUG) { // 记录行为的执行日志
G('behaviorEnd');
trace('Run '.$name.' Behavior [ RunTime:'.G('behaviorStart','behaviorEnd',6).'s ]','','INFO');
}
}
new $class();把自己写的行为类实例化了,并执行了run();run的运行在处理业务逻辑。
二:应用:
那么问题来了:这个行为扩展有什么用呢?
这里举一个实例:比如权限管理,一个管理系统的权限管理,在后台管理中一些人可以用某个模块,一些人不能用某个模块。我们是不是可以在Controller或Action中开处理,在Controller的初始化时处理,在执行某个方法之前做一些处理呢。
看一些系统提供的标签位:这里就有两个这样的标签位:(1):action_name 操作方法名标签位
(2):action_begin 控制器开始标签位
action_begin 标签位被放置在Action.class.php 的初始化函数中
/**
* 架构函数 取得模板对象实例
* @access public
*/
public function __construct() {
tag('action_begin',$this->config);
//实例化视图类
$this->view = Think::instance('View');
//控制器初始化
if(method_exists($this,'_initialize'))
$this->_initialize();
}
这样当我们的一个模块在被执行时你想要添加权限,只要在conf文件中添加tags.php文件的配置项就可以,然后添加行为扩展类即可:如:
在tags.php中可以这样定义:
<?php
/* ---------------------------------------
添加行为
----------------------------------------*/
return array(
'action_begin' => array('AuthCheck'),
);
?>
当执行到tag(‘action_begin’,$this->config);这样的方法时:就会去查找相应的Behavior类了
TP3.1默认行为扩展文件存放在:项目目录的Lib/Behavior目录下面。
建一个class AuthCheckBehavior extends Behavior 这样的继承Behavior 类再重写run方法就可了。
三:总结:
(只是以我现在的水平来说)PHP执行总是按照流程来的,突然冒出来的任何东西或功能,都是在莫个地方被调用了,而且总是按照线性的形式来调用,最后总会汇合到一起结束。当我们看到一些新的东西,我们首先改有的不是畏惧,而是应该找出现这样的原因。有些时候不是我们不懂,只不过是经过了别人的封装而已。
其中若有错误,请指正,此为学习笔记