行为扩展以及插件机制

 在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python android 库_Python库

Gevent Gevent是一个基于greenlet的Python的并发框架&#xff0c;以微线程greenlet为核心&#xff0c;使用了epoll事件监听机制以及诸多其他优化而变得高效。 于greenlet、eventlet相比&#xff0c;性能略低&#xff0c;但是它封装的API非常完善&#xff0c;最赞的是提供了一个…

ios 应用商店_如何在预算范围内制作值得应用商店使用的iOS应用预览

ios 应用商店Back in 2014, Apple made it possible to add an app preview to the the App Store. App previews are the best way to show potential users what your app has to offer before they download the app. In fact, users are 3x more likely to install an app …

搭建nfs共享存储服务之二nfs服务端配置

1.1.NFS服务端配置文件路径为&#xff1a; /etc/exports&#xff0c;并且默认为空&#xff0c;需要用户自行配置。/etc/exports文件配置格式为&#xff1a;NFS共享的目录 NFS客户端地址1&#xff08;参数1&#xff0c;参数2...&#xff09;客户端地址2&#xff08;参数1&#x…

计算机word基本知识选择题,2017计算机基础考试选择题「附答案」

2017计算机基础考试选择题「附答案」一、单项选择题(每题1.5分&#xff0c;共30分)1、文件名使用通配符的作用是(b)A、减少文件名所占用的磁盘空间B、便于一次处理多个文件C、便于给一个文件命名D、便于保存文件2、操作系统是一种(a)A、系统软件 B、系统程序库 C、编译程序系统…

[JLOI2015]管道连接(斯坦纳树)

[Luogu3264] 原题解 多个频道,每个频道的关键点要求相互联通 详见代码,非常巧妙 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> #define debug(...) fprintf(stderr,__VA_ARGS__) #define Debug(…

关于web前端的学习路线

第一阶段&#xff1a; HTMLCSS:HTML进阶、CSS进阶、divcss布局、HTMLcss整站开发、 JavaScript基础&#xff1a;Js基础教程、js内置对象常用方法、常见DOM树操作大全、ECMAscript、DOM、BOM、定时器和焦点图。 JS基本特效&#xff1a;常见特效、例如&#xff1a;tab、导航、整页…

值大于为此列指定的允许精度_电能质量测试精度会受到哪些因素影响?如何解决?...

关于电能质量&#xff08;也称为PQ:Power Quality&#xff09;研究的主题已成为多方面的话题。其需要考虑的不仅仅是IEC 61000-x-x电磁兼容性标准中规定的实际电能质量现象。在实践中&#xff0c;通常还会增加其他重要参数来保证供电的安全性&#xff0c;在某些情况下这些参数甚…

SEO博客

http://www.chinamyhosting.com/seoblog/分类: SEO 本文转自快乐就好博客园博客&#xff0c;原文链接&#xff1a;http://www.cnblogs.com/happyday56/archive/2008/05/10/1191435.html&#xff0c;如需转载请自行联系原作者

gis计算各省河流长度_用河流和各方解释安全漏洞

gis计算各省河流长度by Andrea Zanin由Andrea Zanin 用河流和各方解释安全漏洞 (Security Vulnerabilities Explained with Rivers and Parties) Security vulnerabilities can be boring to learn. But you still need to learn them, unless you want some hacker to delete…

Delphi关于记录文件的操作

http://www.cnblogs.com/railgunman/archive/2010/08/16/1801004.html Delphi关于记录文件的操作 本例子几个变量的说明TFileRec record   //记录定义Day : Integer;...          //其他定义end;f : File of TFileRec;   //标准的输入/输出文件FilRec : TFileR…

pygame游戏开发入门例子

# *_* coding:utf-8 *_*# 开发团队:中国软件开发团队# 开发人员:Administrator# 开发时间:2019/3/23 11:16# 文件名称:pygame_demo# 开发工具:PyCharmimport sysimport pygameimport timedef main(): sizewidth,height640,480 pygame.init() screenpygame.display.set…

HTML引入媒体查询CSS,CSS3 多媒体查询

CSS3 多媒体查询CSS2 多媒体类型media 规则在 CSS2 中有介绍&#xff0c;针对不同媒体类型可以定制不同的样式规则。例如&#xff1a;你可以针对不同的媒体类型(包括显示器、便携设备、电视机&#xff0c;等等)设置不同的样式规则。但是这些多媒体类型在很多设备上支持还不够友…

Codeforces 835 F Roads in the Kingdom(树形dp)

F. Roads in the Kingdom(树形dp) 题意&#xff1a; 给一张n个点n条边的无向带权图 定义不便利度为所有点对最短距离中的最大值 求出删一条边之后&#xff0c;保证图还连通时不便利度的最小值 $n < 2e5 $\(w_i < 1e9\) 思路:树形dp 这个图是一个环上挂着很多颗树&#xf…

前端websocket获取数据后需要存本地吗_是什么让我放弃了restful api?了解清楚后我全面拥抱GraphQL...

GraphQL初步认识背景REST作为一种现代网络应用非常流行的软件架构风格&#xff0c;自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性&#xff0c;可扩展性&#xff0c;伸缩性受到广大Web开发者的喜爱。REST 的 API 配合JSON格式的数…

列出薪金高于在部门30_我如何在五个月内将薪金提高一倍并获得一份了不起的工作...

列出薪金高于在部门30by Sam Williams通过山姆威廉姆斯 我如何在五个月内将薪金提高一倍并获得一份了不起的工作 (How I Doubled my Salary in Five Months and Got an Amazing Job) Six months ago I quit my job as a junior JavaScript developer and travelled around sou…

ftp服务器 vsftpd搭建和配置以及虚拟用户的设置

tp: File Transfer Protocol应用层协议&#xff1a;tcp, 21/tcpC/S&#xff1a;Client: 程序Server: 程序数据&#xff1a;命令连接&#xff1a;文件管理类命令&#xff0c;始终在线的连接数据连接&#xff1a;数据传输&#xff0c;按需创建及关闭的连接数据传输格式&#xff1…

计算机应用基础案例教程总结,计算机应用基础案例教程

包杰军等编著的《计算机应用基础案例教程》以培养职业能力为目标&#xff0c;本着“做学合一”、“理论与实践并行”、“知识与技能并重”的教育思想编写。本书将实际操作案例与教学内容紧密结合&#xff0c;结构清晰、内容翔实、图文并茂、实用性强。全书共分6章&#xff0c;第…

让不支持h5新标签的浏览器支持新标签

把这段js加到页面的头部就可以了&#xff0c;创建想让浏览器支持的标签即可 //条件判断是否支持 h5 if(window.applicationCache){alert("支持h5")}else{alert("不支持h5")document.createElement("article");document.createElement("head…

ios开发之--UIDocumentInteractionController的使用(实现更多分享服务)

最近在做项目的时候&#xff0c;碰到这样一个需求&#xff0c;就是本地生成pdf文件&#xff0c;然后本地打开&#xff0c;经过测试发现&#xff0c;pdf文件是无法保存到相册里面的&#xff0c;只能存到手机里面&#xff0c;鉴于苹果的存储机制&#xff0c;需要取出来&#xff0…

eclipse tomcat新建一个_Javaweb07-Eclipse自动创建动态web项目

学习笔记是参考的how2j使用Eclipse创建Dynamic Web Project前面的web项目都是通过手动创建的&#xff0c;现在使用eclipse EE自动创建动态web项目&#xff0c;熟悉一下创建流程&#xff0c;仍旧使用前面创建过的HelloServlet。需要注意的是&#xff0c;这里的tomcat版本变了&am…