OneThink插件中控制器访问路径控制

问题分析

今天在使用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执行过程

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

你可能感兴趣的:(插件,路径)