ThinkPHP插件钩子(Hook)详解(含实例)
行为(Behavior)概述:
行为(Behavior)是ThinkPHP扩展机制中比较关键的一项扩展,行为既可以独立调用,也可以绑定到某个标签中进行侦听,官方提出的CBD模式中行为也占了主要的地位,可见行为在ThinkPHP框架中意义非凡。
这里指的行为是一个比较抽象的概念,你可以想象成在应用执行过程中的一个动作或者处理,在框架的执行流程中,各个位置都可以有行为产生,例如路由检测是一个行为,静态缓存是一个行为,用户权限检测也是行为,大到业务逻辑,小到浏览器检测、多语言检测等等都可以当做是一个行为,甚至说你希望给你的网站用户的第一次访问弹出Hello,world!这些都可以看成是一种行为,行为的存在让你无需改动框架和应用,而在外围通过扩展或者配置来改变或者增加一些功能。
而不同的行为之间也具有位置共同性,比如,有些行为的作用位置都是在应用执行前,有些行为都是在模板输出之后,我们把这些行为发生作用的位置称之为标签(位),当应用程序运行到这个标签的时候,就会被拦截下来,统一执行相关的行为,类似于AOP编程中的“切面”的概念,给某一个切面绑定相关行为就成了一种类AOP编程的思想。
AOP编程概述:
Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
ThinkPHP版本是3.2.3
下面ad(广告)的钩子实例代码:
\ThinkPHP\Library\Behavior\ 目录下新建adBehavior.class.php
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php namespace Behavior; /** * 行为扩展:广告插件test. * author lzq(674531003@qq.com) */ class adBehavior { public function run($arg) { echo '我是一条'.$arg['name'].'广告,'.$arg['value'].'的值'; } } |
\Application\Home\Controller\IndexController.class.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace Home\Controller; use Think\Controller; use Think\Hook; /** * 首页控制器 * author lzq(674531003@qq.com) */ class IndexController extends Controller { public function index(){ //$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p><br/>版本 V{$Think.version}</div><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_55e75dfae343f5a1"></thinkad><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script>','utf-8'); Hook::add('ad','Behavior\\adBehavior'); $this->display(); } } |
\Application\Home\View\index\index.html 首页模板文件
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>ThinkPHP3.2.3行为(Behavior)扩展以及插件钩子(Plug or Hook)详解(含实例)www.phperblog.cn </title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="description" content="Hook使用方法www.phperblog.cn荣誉出品" /> </head> <body> <h1>How to used?</h1> {:hook('ad', array('name'=>'测试','value'=>'哈哈test'))} </body> </html> |
\ThinkPHP\Common\function.php 的tag方法 处理下 更改为
1 2 3 4 5 6 7 8 9 |
/** * 处理标签扩展 update lzq于2015.11.30 * @param string $tag 标签名称 * @param mixed $params 传入参数 * @return void */ function hook($tag, $params=NULL) { \Think\Hook::listen($tag,$params); } |
页面效果:
思路:在控制器中,先将钩子标签添加,然后在模板中调用相应的钩子名。
- jQuery表格插件DataTables案例
- git命令简单使用案例