行为扩展以及插件机制

在thinkPHP中的行为扩展和插件机制。

首先行为扩展这个概念是TP框架的核心组成之一,关于行为的解释我就粗略的概括一下吧:

TP在从接受到HTTP请求到最终将试图输出,期间经历的很多步骤,这些步骤大家可以在http://document.thinkphp.cn/manual_3_2.html#system_process这里面看到。

那么行为扩展实际上就是在这些流程里面买下了一个钩子,你可以往钩子里添加你自己的业务逻辑

当程序执行到某些钩子位置时将自动触发你的业务逻辑,http://document.thinkphp.cn/manual_3_2.html#behavior_extend。

本文的主要目的是教大家如何使用行为扩展和插件,这里为什么要提到“插件”这个词呢?

因为在3.2里,有了一个插件的概念,和行为公用的HOOK类,所以放在一起说,原理上并无

并无太大区别。

-、行为扩展

1.TP 内置行为钩子

我们知道TP中预留一些行为钩子,比如action_begin,这个钩子实在动作开始执行时触发,

预置的钩子大家购过配置文件注册行为类,大家在Application/Common/Conf目录下创建一个

tags.php。这个和3.1是一样的,返回一个数组。

数组个会是“钩子名”=>“array(“行为类”,“行为类2”......................)”

这里我给一个例子:

Application/Common/Conf/tag.php:

<?php

return array(

"action_begin"=>array("Behaviors\\test")

);

?>

可以看到,我往action_begin这个钩子里面注册一个行为,这个行为就是Beha\\test这里

的写法是命名空间写法,其对应的类文件路径是:

Application/Behaviors/testBehavior.class.php:

<?php

namespace Behaviors;

class testBehavior{

function run ($arg){

echo "这里是一行为扩展"。$arg;

}

}

?>

千万要注意第一行的命名空间,对于命名空间不理解的请自行查阅php手册。

另外对于TP的自动加载机制,参考手册:

http://document.thinkphp.cn/manual_3_2.html#autoload

行为的执行入口是run()方法,触发钩子时会自动执行行为类里的run()方法。

2.动态添加钩子和注册行为

通过上面的而梨子大家才是了解了行为大概是个什么东西,但是对于其执行流程

可能还不清楚,这里我来介绍下动态添加钩子和注册行为,是大家对行为执行机制

有一个比较清晰的理解。

首先,行为钩子添加和注册行为类,以及处罚行为,都是通过Hook类来实现的。

Hook类在TP核心包里的ThinkPHP目录下,Hook.class.php。

>>添加钩子以及注册行为:\Think\HooK::(‘钩子名’,‘行为’)

>>埋设/监听/触发钩子:\Think\Hook::listen(‘钩子名’,‘传递给run的参数,必须是个变量’ );

假如我们需要在访问index.php/Public/login.html的时候触发login钩子里的行为,

那么首先我们需要在login方法中监听钩子,也就是把钩子埋在login方法里,当访问login方法就是

自动触发,有点像猎人的陷阱。

function login(){

\Think\Hook::listen(‘login‘);

}

好了,我们在login方法里监听了login钩子,那么接下来我们往这个钩子里添加一些行为,

这样访问login的时候会自动触发这些行为,执行行为类的run方法。

行为在哪里注册了?

1.你可以通过tags.php注册,上面提到过了,只不过把action_begin换成login.

2.动态添加,假如这个钩子只在Public控制器中使用,那么你可以子啊PUblicController的

_initialize()初始化方法肿么的动态添加钩子。

function _initialeze(){

\Think\Hook::add(‘login‘,‘Behaviors\\test‘);

}

这里就往login这个钩子里添加一个test行为,比较懒直接从上面复制下来。

可以同时添加多个行为类

\Think\Hook::add(‘login‘,array(‘Behaviors\\test‘,‘Behaviors\\test1‘....));

就是第二个参数变成一个数组,数组里面每个元素对于一个行为类。

3.带参数的行为

上面我们知道了行为是通过run()方法执行的,那么我们想传递一些参数进去怎么办呢?

答案是\Think\Hook::listen();的第二个参数。

注意listen方法定义如下:

static public function listen($tag,&$param-NULL)

可以看到第二个参数是一个引用传递的参数,也就是说第二个参数必须是一个变量,不能是值,

下面的使用方法是错误的:
\Think\Hook::listen(‘login‘,"hello"); // x
这样才是正确的
$hello = "hello";
\Think\Hook::listen(‘login‘,$hello);//√

这样我们在行为类里面run方法可以指定一个参数来接收$hello
function run($arg){
echo $arg;//输出 hello
}
当然你也可以
function run(&$arg){
echo $arg;//输出hello
$arg = "bye";
}
这样参数设定为引用类型,你可以在run里面改变原始变量的值。

二、插件

看了上面的行为,我们可以总结出一个模式:
定义不同的行为,执行同一个方法run ,而插件呢?

他是可以定义在run的并且相当于在一个行为类里面可以有多个入口,这些入口在不同的条件下触发。

假设我们在tags.php里面添加了这样一个钩子

‘showflash’=>array(‘test‘);

注意与行为的区别,注册行为需要包含命名空间也是反斜杠\\,当没有反斜杠,只有一个单词的时候将认为是一个插件。

插件定义在Application/Addons/插件名/插件名Addon.class.php

插件类的定义

<?php
namespace Addons\test;
class testAddon{
function showflash(){
echo "这是插件执行入口";
}
}
?>

可以看出来一个明显的区别,就是run入口变成了showfalsh,和钩子名相同。

假如我们再来一个钩子:

‘‘=>

时间: 2024-10-25 04:20:34

行为扩展以及插件机制的相关文章

thinkphp 行为扩展以及插件机制介绍

首先行为扩展这个概念是TP架构的核心组成之一,关于行为的解释我就粗略的概括一下吧:TP在从接受到HTTP请求到最终将视图输出,期间经历的很多步骤,这些步骤大家可以在http://document.thinkphp.cn/manual_3_2.html#system_process 这里面看到,这里就不再详细叙述了,那么行为扩展实际上就是在这些流程里埋下了一个钩子,你可以往钩子里添加你自己的业务逻辑,当程序执行到某个钩子位置时将自动触发你的业务逻辑,关于系统预置的一些钩子可以参考:http://d

基于接口的插件机制

一.前言 插件,意味着可扩展,且宿主程序不依赖于插件,即插即用.这种软件设计方式可以使我们的应用程序最大化地获得可扩展性.适应性和稳定性,而且便于软件的维护和升级.在什么场景下使用插件呢?例如在本篇文章中,我个人有一个小需求就是希望记事本带行号,于是我自己写了一个极简易的编辑器(CodeEditor),以这个编辑器为例,主体程序功能包括常见的新建.复制.查找.保存等已经完成,但是在使用的过程中发现需要用到 格式化 这个功能,但是我还不想再去改主程序,这种情形下就可以通过插件来实现,这样以后在使用

php中的钩子(hook插件机制)

对"钩子"这个概念其实不熟悉,最近看到一个php框架中用到这种机制来扩展项目,所以大概来了解下. hook插件机制的基本思想: 在项目代码中,你认为要扩展(暂时不扩展)的地方放置一个钩子函数,等需要扩展的时候,把需要实现的类和函数挂载到这个钩子上,就可以实现扩展了. 思想就是这样听起来比较笼统,看一个网上的实现的例子. 整个插件机制包含三个部分: 1.hook插件经理类:这个是核心文件,是一个应用程序全局Global对象.它主要有三个职责 1>监听已经注册了的所有插件,并实例化这

Atitit&#160;插件机制原理与设计微内核&#160;c#&#160;java&#160;的实现attilax总结

Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结 1. 微内核与插件的优点1 2. 插件的注册与使用2 2.1. Ioc容器中注册插件2 2.2. 启动器微内核启动3 3. 插件的俩种执行策略3 3.1. 必须手动接续,否则自动终止(推荐)3 3.2. 必须手动throw  stop ex终止,负责自动接续..4 4. 插件链的生成原理4 5. -------code4 6. 参考7 1. 微内核与插件的优点 但凡有生命力的产品,都是在扩展性方面设计的比较好的,因

从npm tips到express插件机制设计

大部分时间,我们只用到npm的install,init,publish等功能,但它设计的非常好,有很多是我们不了解的 一起看一下 全局命令 用nodejs来写cli工具是非常爽的,我干了不少这样的事儿 kp =kill by port je = json editor mh = start mongo here 核心就是在package.json里配置 "preferGlobal": "true", "bin": { "mh"

浅谈ecmall插件机制

插件是独立于原系统的程序模块,目的是在不修改原程序的情况下对系统进行扩展,便于修改和管理.目前web开发中大多是使用钩子形式来定义插件, 比较典型的有 wordpress, drupal系统 ecmall的插件机制: ecmall提供了3中扩展系统功能的方法. 挂件,模块,插件. 方便我们进行二次开发.下面我们就演示一下如何制作一个插件.首先在 external/plugins目录下新建一个目录,命名为hello_world,然后进入该目录,新建2个文件 main.plugin.php 和 pl

JQ插件机制

JQ插件概述 所谓的jquery插件,其实就是利用jquery语法,完成的一些工具或者模块.jquery插件是jQuery功能的扩展.可以让开发人员能更好更快速的完成某些特定的需求,只需要用很少的代码就能实现很好的效果. 自定义插件 JQ允许自定义插件,对JQ的方法进行扩展.自定义插件主要分两种: JQ元素扩展和JQ本身扩展. JQ元素扩展: 方法: jQuery.fn.extend(object) 概述 扩展 jQuery 元素集来提供新的方法(通常用来制作插件). 也就是说,该方法可以用来扩

活字格 Web 应用生成平台 V4.0 发布,首次公开插件机制

日前,活字格 Web 应用生成平台发布 V4.0 版本,首次公开插件机制,强大的扩展性和系统集成能力,引起业内瞩目. 活字格是由西安葡萄城自主研发的 Web 应用生成平台,提供易用的类 Excel 可视化设计器和灵活的定制能力,帮助使用者以无代码或少写代码的方式,快速自主创建各类企业管理系统,如生产管理.进销存.项目信息管理.车辆设备管理.人事考勤管理.出差管理.会议室预定等,满足企业个性化管理需求,灵活方便,即改即用. 活字格具有强大的扩展性和系统集成能力: 开放的插件机制在本次 V4.0 发

jQuery扩展与插件--附源码分析

扩展与插件 1. 编写JQuery插件 <script> $.extend(object) //为JQuery 添加一个静态方法. $.fn.extend(object) //为JQuery实例添加一个方法. jQuery.extend({ min: function(a, b) { return a < b ? a : b; }, max: function(a, b) { return a > b ? a : b; } }); console.log($.min(3,4));