在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,和钩子名相同。

假如我们再来一个钩子:

''=>

转载于:https://www.cnblogs.com/yeyublog/p/6081147.html

行为扩展以及插件机制相关推荐

  1. mixin机制 vue_读?VuePress(四)插件机制

    前言 从 9 月份开始,vuepress 源码进行了重新设计和拆分.先是开了个 next 分支,后来又合并到 master 分支,为即将发布的 1.x 版本做准备. 最主要的变化是:大部分的全局功能都 ...

  2. 【问链-EOS公开课】第十三课 EOS插件机制深入解析

    插件体系 EOS插件由三层类来实现. 最顶层是抽象类abstract_plugin,定义了插件的基本接口. 中间层是插件模板类plugin,主要用来解决插件之间依赖调用. 最底层是具体插件类,专注单个 ...

  3. Omi框架学习之旅 - 插件机制之omi-finger 及原理说明

    以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到, 而且源码只有350来行代码,很容易看懂. 那么怎么把这么好的库作为omi库的一个插 ...

  4. jquery function_前端基础进阶(十三)详细图解jQuery扩展jQuery插件

    UI 鉴赏 早几年学习前端,大家都非常热衷于研究jQuery源码. 我至今还记得当初从jQuery源码中学到一星半点应用技巧的时候常会有一种发自内心的惊叹,"原来JavaScript居然可以 ...

  5. iOS之深入解析CocoaPods的插件机制和如何加载插件整合开发工具

    一.CocoaPods 插件机制 ① Ruby 在 Ruby 中,类永远是开放的,总是可以将新的方法加入到已有的类中,除了自己的代码中,还可以用在标准库和内置类中,这个特性被称为 Ruby Open ...

  6. 解析 WordPress 插件机制

    一直对软件的组件.插件架构非常感兴趣,我认为现在开发任何应用程序,一定要有一个架构良好的插件机制,这样可以吸引其他人来开发插件,极大的扩充 系统的功能.Eclipse就是一个非常棒的例子,几乎你想什么 ...

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

    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结 1. 微内核与插件的优点1 2. 插件的注册与使用2 2.1. Ioc容器中注册插件2 2.2. 启动器微内核启动3 ...

  8. c语言插件实现原理,C语言实现插件机制

    现在越来越多的软件项目都提供插件机制,这样使得软件的扩展性大大增强,那么到底插件机制的实现是怎么样的呢?在这里只谈论C语言的实现,其实C语言实现插件的例子也很多,像mjpg-streamer就是将输入 ...

  9. Delta3d插件机制

    Delta3d插件机制主要通过以下两个类实现: class MainWindow;/**Abstract interface class for STAGE plugins*/class Plugin ...

最新文章

  1. 做了这么多年的研发,其实你一点也不懂购物车的设计思路!
  2. 详解神秘Linux内核
  3. android 点击网络图片大全,android查看网络图片的实现方法
  4. 【推荐】如何使用好阿里云的网络安全隔离?深入分享阿里云ECS安全组实践经验...
  5. 查看apk的签名信息和签名文件的信息
  6. hive2 java连接_用Java代码通过JDBC连接Hiveserver2
  7. Linux——用户管理简单学习笔记(三)
  8. Windows核心编程_Edit控件无法输入问题
  9. 关于命令行启动MySQL服务的相关问题
  10. 黑马程序猿 IO流 ByteArrayInputStream与ByteArrayOutputStream
  11. [WebApi] 捣鼓一个资源管理器--多文件上传+数据库辅助
  12. php网易云随机音乐api源码开源,网易云音乐随机歌曲
  13. selenium借助pywinauto工具上传附件
  14. “项目集管理标准体系与PgMP认证”讲座笔记
  15. Java开发Telegram机器人
  16. QT之鼠标点击事件学习
  17. 注册AWS账号创建EC2免费套餐详细教程
  18. 【学浪下载教程】02学浪下载之Fiddler学浪插件配置
  19. 网络工程师知识点整理—第五章:无线通信网
  20. 信号明确简单 顶底指标公式 通达信 副图 源码

热门文章

  1. linux服务器基本常识,服务器搭建-Linux基础知识
  2. linux vfs open函数,Linux VFS中open系统调用实现原理
  3. c# mysql 插入 和 查询_C#对数据库的操作(增删改查)
  4. 法律专业计算机基础试卷答案,大学计算机基础试题及答案
  5. php如何转类型,PHP数据类型转换
  6. Java ClassLoader findLoadedClass()方法与示例
  7. 三、Numpy数组操作
  8. python合并两个文本文件内容_用Python 将两个文件的内容合并成一个新的文件.
  9. 1.1.1.1校园网_Apache Flink 1.11.0 重要功能全面解析
  10. [Golang]Go语言学习资源集合