标签:
今天在使用OneThink的时候,发现竟然还可以调用插件里面的控制器如index.php?s=/Addons/execute/_addons/EditorForAdmin/_controller/Upload/_action/ke_upimg.html
,代表调用了addons/EditorForAdmin/Controller/UploadController.class.php中ke_upimg,感觉用了这么久的TP,一直没有这么做过,有必要去深究一下,其能这样做的原因。通过分析路由,发现其实调用的是/Home/AddonsController.class.php中的execute方法,然后在execute方法中,在实例化UploadController类,并调用ke_upimg方法。其实,就相当于让Home/AddonsController.class.php类做一个代理而已,_addons/EditorForAdmin/_controller/Upload/_action/ke_upimg.html
作为参数。弄清楚这些之后,那么后期写自己的插件也就相当方便了。
AddonsController.class.php文件
class AddonsController extends Controller{
protected $addons = null;
public function execute($_addons = null, $_controller = null, $_action = null){
if(C(‘URL_CASE_INSENSITIVE‘)){
$_addons = ucfirst(parse_name($_addons, 1));
$_controller = parse_name($_controller,1);
}
if(!empty($_addons) && !empty($_controller) && !empty($_action)){
$Addons = A("Addons://{$_addons}/{$_controller}")->$_action();
} else {
$this->error(‘没有指定插件名称,控制器或操作!‘);
}
}
}
我在下oneThink/Addons/Calendar/Controller定义了控制器LogController.class.php,如下图,
<?php
// +----------------------------------------------------------------------
// | Copyright (c) http://blog.csdn.net/hsd2012 All rights reserved.
// +----------------------------------------------------------------------
// | Author: dequan
// +----------------------------------------------------------------------
// | Time: 2016-06-15
// +----------------------------------------------------------------------
namespace Addons\Calendar\Controller;
use Think\Controller;
class LogController extends Controller{
/**
* 添加日志
*/
public function addLog(){
var_dump(‘addLog‘);
}
}
那么怎样才能访问该控制器呢?使用如下地址,因为我在入口文件中,绑定了模型Home,所以调用时候,不需要添加模型名称。
localhost/index.php?s=/Addons/execute/_addons/Calendar/_controller/log/_action/addLog.html
执行结果
ThinkPHP执行过程简化后,可以归结如下
index.php—->Think.class.php——->app.class.php
1.初始化参数(定义一下常量、加载一些配置文件),定义异常、错误、文件自动加载,定义存储方式
2.路径解析以及相应的过滤
3.创建请求的控制器对象
4.通过反射获取请求的方法,判断其属性,并获取方法的所有参数。
5.通过反射获取请求的控制器类,判断其是否定义了‘_before_‘.$action
方法,请判断该方法属性,如果是public属性,则调用该方法。
6.通过反射,调用请求的方法
7.判断其是否定义了‘_after_‘.$action
方法,请判断该方法属性,如果是public属性,则调用该方法。
8.针对上述的行为,ThinkPHP中定义了相应的行为钩子,当行为执行之前或之后,就调用相应的行为钩子。
插件开发可以参考如下网址
http://blog.csdn.net/hsd2012/article/details/51658880
标签:
原文地址:http://blog.csdn.net/hsd2012/article/details/51682244