网站程序在运行的过程每个过程都可以看做是一种行为,例如:运行应用,加载类,执行方法,加载模板,解析模板等,也就是说,我们在程序执行过程中每个 步骤都可以 定义一些点,我们可以在运行 程序的时候 检查 配置文件 中有没有定义 这些点 对于操作哪些 方法,如果有,则在这个点上加载执行 特定的方法。执行完,上面进行的方法没有中断退出程序操作,则程序继续进行 原来业务操作。

这种行为的扩展,可以方便,产品完成以后,需要在原功能上添加功能,常见的例如:在应用执行前 先检测是否登录;在用户执行应用前先检测 用户设备信息;用户登录完成,给用户加积分等。

下面是thinkphp 的行为扩展的使用

官方文档手册 行为扩展

第一步:首先是到你的模板下Common\Conf\tags.php 看看是否有这个 tags.php 文件,如果没有那么就自己建一个

第二步:配置你的 插入点 所要进行 方法,配置例如:

<?php
return array( 'app_end'=>array('Home\\Behaviors\\testBehavior','Home\\Behaviors\\test1Behavior')
);

  上面app_end是插入点名称,对应的值定义了两个 行为,也就是说,当程序执行到 app_end这个点的时候 会加载 这个配置中的这两个类来执行,每个点都可以有多个 行为类。

上面的这两行为类 是放在放在 Home模块下的Behaviors文件下的两个类,这些类可以放到如何地方,只要配置中配置好就可以了

下面,我们就在Home\Behaviors\下去建这两个行为

上面注册了两个行为,分别是Home模块下的test和test1行为,类文件位于Home模块目录下的Behaviors目录,可以自定义目录。 行为必须是一个包含命名空间路径的类,如上的 Home\Behaviors\test 对应的类是 Home/Behaviors/testBehavior.class.php。

第三步:到自己定义的目录下建这个行为类

文件testBehavior.class.php代码如下

<?php
namespace Home\Behaviors;
use Think\Behavior;
class testBehavior extends Behavior{
//行为执行入口
public function run(&$param){
echo '这是我的插件';
}
}

这样只要我们程序运行到app_end这个点就会执行我的这个类的 run()方法。

运行结果如下:

我们在类中继承了Behavior这个内置类的,必须要实现 他的run(),所以这里用&来引用传值进行执行,很明显这样不是我想要的,我们就像要自由一点。

下面进行改造,我们不继承了他默认的行为类了,按照官方规定我们的行为类,只要有run()这个方法,程序就会自动执行这个run(),那么就我们把我们行为改为如下的:

namespace Home\Behaviors;
use Think\Controller;
class testBehavior extends Controller{
//行为执行入口
public function run($param){
echo '这是我的插件';
}
}

现在的参数不用&来引入传值都不会报错了,插件仍然可以正常运行。

动态添加 行为,并在模板中调用

如果,我们不想用框架 预定义的插入点, 我想在我们 方法中 定义我们的 行为点,并模板中调用,那么,我们在Common\Conf\tags.php把 我们这个行为类去除,否则多次执行这个行为了。

现在我们想在news类中的lists 方法中 动态添加 一个行为 检测点为 ad, 要执行的行为 是Home/Behaviors/testBehavior.class.php 代码如下:

<?php
namespace Home\Controller;
use Think\Controller; class NewsController extends Controller{ public function lists()
{
\Think\Hook::add('ad','Home\\Behaviors\\testBehavior');//这里动态添加一个 ad 的行为
$this->theme('default')->display('./newslist');
} }

我要在模板中 要调用这个 ad 的行为 那么我就可以在newslist这个模板中 用以下发方式调用

{:tag('ad')}

这样就可以在我们的特定地方调用这个插件,效果如下

thinkphp 行为扩展的更多相关文章

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

    首先行为扩展这个概念是TP架构的核心组成之一,关于行为的解释我就粗略的概括一下吧:TP在从接受到HTTP请求到最终将视图输出,期间经历的很多步骤,这些步骤大家可以在http://document.th ...

  2. Thinkphp编辑器扩展类kindeditor用法

    一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...

  3. thinkphp Widget扩展

    Widget扩展一般用于页面组件的扩展.大理石平台规格 举个例子,我们在页面中实现一个分类显示的Widget,首先我们要定义一个Widget控制器层 CateWidget,如下: namespace ...

  4. thinkphp 标签扩展

    标签库加载直线电机参数 模板中加载标签库,预加载自定义标签库,扩展内置标签库的加载 请参考:http://document.thinkphp.cn/manual_3_2.html#taglib 自定义 ...

  5. ThinkPHP添加扩展配置失败

    扩展配置可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样.设置扩展配置的方式如下(多个文件用逗号分隔): // 加载扩展配置文件 'LOAD_EXT_CONFIG' => 'us ...

  6. thinkphp引入PHPExcel类---thinkPHP类库扩展-----引入没有采用命名空间的类库

    最近项目中遇到引入PHPExcel第三方类库 但是下载的phpExcel类没有命名空间,而且所有接口文件的命名都是以.php结尾  而不是tp中的.class.php 解决办法很简单:在引入没有采用命 ...

  7. ThinkPHP - 自定义扩展类库

    首先在想要使用类库的地方建立文件夹,文件名称随意,不能使用class 然后在配置文件中: 'AUTOLOAD_NAMESPACE' => array( 'Lib' => './Lib', ...

  8. ThinkPHP框架设计与扩展总结

    详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一 ...

  9. ThinkPHP入门(二)

    smarty使用 smarty引入流程 1. 控制器IndexAction.class.php function index() $this -> display(); (父类Action的di ...

随机推荐

  1. 洛谷P1126 机器人搬重物

    洛谷1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格, ...

  2. Linux内核系列之Block块层(一)

    .Block块层入口函数为 genhd_device_init(),先对该函数开始分析: 函数实现源码: static int __init genhd_device_init(void) {     ...

  3. hadoop入门必备基础知识

    1.对Linux 系统的要求        会基本的命令:        (1)知道root用户        (2)ls命令会查看文件夹内容        (3)cd命令等2.Java 的要求    ...

  4. Redis在PHP中的基本使用案例

    下载http://www.oschina.net/p/redis 解压后里面有:lib 源文件 .examples 例子.test测试 将lib目录拷贝到你的项目中,就可以开始你的predis操作了. ...

  5. hdoj 1231 最大连续子序列

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  6. mongodb 在windows上安装为服务

    // mongo 也是先安装扩展 在安装为服务 首先 先下载mongodb的压缩包 解压(一个bin文件夹 三个文件) 在目录下 新建立一文件夹 mongodb 然后将解压的内容放进去 然后在mong ...

  7. 第一步 配置D2RQ环境

    ​第一步 配置D2RQ环境 Getting Started 2013年10月15日 15:16:55 老套路,还是先配置环境,没查到什么中文资料,写在这里,供大家参考.有需要交流的可以加QQ: 1q7 ...

  8. 第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解

    [问题描述] C国共有$n$个城市.有$n-1$条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了$m$条旅行的路线, 第$i$条旅行路线的起点是$s_i$,终 ...

  9. 【JAVA - 基础】之Annotation注解浅析

    注解在JAVA中,尤其是一些ORM框架(如Hibernate等)中是比较常用的一种机制. 注解是JAVA 1.5之后引入的新功能,正确来说是反射的一部分,没有反射,注解也就无法正常使用.注解可以理解成 ...

  10. NSUserDefaults偶尔/有时候保存数据会失败/失效

    之前已经实现了通过NSUserDefaults去保存用户数据: [已解决]iPhone/iOS中保存自定义对象(Custom Object/Custom Class)的数组(NSMutableArra ...