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

Posted 我爱默小兜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于OneThink插件中控制器访问路径控制的主要内容,如果未能解决你的问题,请参考以下文章

MVC模式中控制器(servlet)接收请求参数、调用DAO、保存处理结果、改变路径并转发(响应)

Springboot中控制器的使用

计算机中控制器中常见的寄存器及其作用

简易中控紫猫插件版

phpstorm怎么添加码云的版本控制器

Spring 项目中控制器和服务类的通用类