Stay hungry, Stay foolish

0%

TP笔记7:App(三)

exec方法

1
2
$tagOn   =  C('APP_PLUGIN_ON');
if($tagOn) tag('app_run');

扩展标签是否开启,如果开启的话,在此加一个app_run的标签扩展。

1
2
3
//创建Action控制器实例
$group = defined('GROUP_NAME') ? GROUP_NAME.C('APP_GROUP_DEPR') : '';
$module = A($group.MODULE_NAME);

判断是否存在分组。实例化Action。

1
2
3
4
5
6
7
8
9
10
if(!$module) {
$_module = C('_modules_.'.MODULE_NAME);
if($_module) {
import($_module[0]);
$class = isset($_module[1])?$_module[1]:MODULE_NAME.'Action';
$module = new $class;
}else{
$module = A("Empty");
}
if(!$module) throw_exception(L('_MODULE_NOT_EXIST_').MODULE_NAME);

如果模块没有实例化成功(模块名不存在等等),就会检查是否有扩展模块或空模块,实例化,反之就抛出一个模块不存在的异常。

1
2
3
4
5
6
$action = ACTION_NAME;
if(strpos($action,':')) {
$actionList = explode(':',$action);
foreach ($actionList as $action){
$module->$action();
}

获取当前的操作名,判断操作里是否有多个操作名。TP里支持使用操作链的方式:

1
http://serverName/appName/User/action1:action2:action3/

那么会依次执行UserAction的action1 、action2 和action3方法,并且当前操作名称是最后一个操作。在进行默认模板输出的时候会用到。如果确实需要在不同的操作方法中都进行输出,请确保在Action的display方法中指定需要渲染的模板文件名。否则,只能输出最后的操作模板。使用了操作链后,前置和后置方法会失效。

1
2
3
4
5
6
7
8
9
10
}else{
if (method_exists($module,'_before_'.$action)) {
call_user_func(array(&$module,'_before_'.$action));
}
call_user_func(array(&$module,$action));
if (method_exists($module,'_after_'.$action)) {
call_user_func(array(&$module,'_after_'.$action));
}
}
if($tagOn) tag('app_end');

如果有前置操作,会先执行前置操作的代码;然后执行本次操作;最后判断是否有后置操作,执行。

开启标签扩展的话,注册一个app_end的扩展。

1
return ;

如你所见,这个exec就是进入到用户定义的Action里执行操作,这里就是用户的一些逻辑了:数据处理,页面显示。到这,一个web页面(哪怕只有echo)就显示出来了。到此之为,框架的准备工作就完成了。

据说打赏我的人,代码没有BUG