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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值