码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2016-06-16 15:00:03      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

问题分析

今天在使用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

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

标签:

原文地址:http://blog.csdn.net/hsd2012/article/details/51682244

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!