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

时间: 2024-08-02 18:45:00

OneThink插件中控制器访问路径控制的相关文章

浅析Java中的访问权限控制

浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理? 场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1.fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理? 此时,访问权限控制便可以

Java成员的访问权限控制

Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以是public,protected, package private(无修饰符), or private. 以下表格总结了类成员中不同访问权限控制修饰符对应的访问级别:

servlet中的相对路径和绝对路径

servlet中,所有路径的配置都要用绝对路径. 什么是绝对路径,就是以“/”开头的路径(开发中就这样理解). 实际开发中,“/”所代表的含义不同,但主要分以下两种情况: 1.servlet内部配置路径 servlet内部的含义就是:在客户端看不到,全是在(应用)后台处理的部分(简单说,就是除了JSP以外的所有地方).包含以下2点: a. web.xml中servlet 配置的路径 <servlet>  <servlet-name>helloWorld</servlet-na

onethink插件控制器如何访问?

例如:新增一个Baoming的插件: 那么如何,访问这个控制里面方法呢? 例如:访问 change 方法: /Addons/execute/_addons/插件名/_controller/控制器名/_action/方法名.html 例如这个: http://onethink.fyz.com/admin.php?s=/Addons/execute/_addons/Baoming/_controller/Baoming/_action/change.html

Web项目中访问路径需要注意的一些问题

在jsp中,访问后台时习惯用 ${pageContext.request.contextPath}获取项目路径 因为这个使用的很频繁,所以可以在定义一个头jsp 比如下面这个 1 <c:set var="baseurl" value="${pageContext.request.contextPath}/"></c:set> 注意了,这里的${pageContext.request.contextPath}后面加了一个 / 加上这个/本意是想

[Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据

目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net MVC]Asp.net MVC5系列——添加模型 概述 上篇文章介绍了如何添加Model,在这篇文章中,我们将通过控制器访问模型中的数据,还有有写朋友问我,这么简单的东西有必要分享吗?其实有些东西真的很简单,没必要分享,但是这也是我学习的历程,希望记录自己是

Eclipse中修改Web项目访问路径

背景 访问路径,也就是指在浏览器中访问该web系统时的根路径,比如http://localhost:8080/xxxx/index.jsp  这里的xxxx,也就是request.getContextPath()得到的值. 我们在做系统开发的时候,在本地工作区可能会有同一个系统的多个版本存在,比如上面所说的xxxx系统,这里可能会有xxxx1.xxxx1_1.xxxx1_2代表该系统的1.0 .1.1. 1.2版本,对应的工程名字默认就是系统的访问路径,但是,我们可能会希望这些项目能够有一个统一

Eclipse (JavaEE版)中修改web项目的访问路径

访问路径,也就是指在浏览器中访问该web系统时的根路径,比如http://localhost:8080/xxxx/index.jsp  这里的xxxx. 也就是request.getContextPath()得到的值. 我们在做系统开发的时候,在本地工作区可能会有同一个系统的多个版本存在,比如上面所说的xxxx系统,这里可能会有xxxx1.xxxx1_1.xxxx1_2代表该系统的1.0 .1.1. 1.2版本,对应的工程名字默认就是系统的访问路径,但是,我们可能会希望这些项目能够有一个统一的访

tomcat中实现特定路径下的图片的url访问

使用Tomcat作为服务器的时候,如果不配置图片保存路径,将图片保存在项目路径下,那么再次打war包发布项目可能会造成图片的丢失,每次重启前将图片先保存再copy到服务器明显不方便,这时可以配置图片保存位置,将图片保存到项目外的地方,方法如下: 打开tomcat - conf下的server.xml文件,在Host节点下添加 <Context  docBase="G:/upload/images"  path="/images" /> docBase为图