Thinkphp 框架扩展之行为扩展原理与实现方法分析
本文实例讲述了Thinkphp 框架扩展之行为扩展原理与实现方法。分享给大家供大家参考,具体如下:
系统核心提供的标签位置包括下面几个(按照执行顺序排列):
app_init | 应用初始化标签位 |
path_info | PATH_INFO检测标签位 |
app_begin | 应用开始标签位 |
action_name | 操作方法名标签位 |
action_begin | 控制器开始标签位 |
view_begin | 视图输出开始标签位 |
view_parse | 视图解析标签位 |
template_filter | 模板内容解析标签位 |
view_filter | 视图输出过滤标签位 |
view_end | 视图输出结束标签位 |
action_end | 控制器结束标签位 |
app_end | 应用结束标签位 |
在每个标签位置,可以配置多个行为定义,行为的执行顺序按照定义的顺序依次执行。除非前面的行为里面中断执行了(某些行为可能需要中断执行,例如检测机器人或者非法执行行为),否则会继续下一个行为的执行。 行为定义: 通过Common\Conf\tags.php配置文件定义,格式如下:
<?php return array( 'action_begin'=>array('Home\\Behaviors\\TestBehavior','Home\\Behaviors\\Test1Behavior'), );
上面注册了两个行为,分别是Home模块下的test和test1行为,类文件位于Home模块目录下的Behaviors目录,可以自定义目录。
行为必须是一个包含命名空间路径的类,如上的 Home\Behaviors\TestBehavior 对应的类是 Home/Behaviors/TestBehavior.class.php。
除了这些系统内置标签之外,开发人员还可以在应用中添加自己的应用标签。 比如在控制器的_initialize方法中:
\Think\Hook::add('action_begin','Home\\Behaviors\\TestBehavior'); //同时添加多个行为,只要将第二个参数换成数组即可。
行为类的定义,以上面的test行为为例:
<?php namespace Home\Behaviors; class TestBehavior extends \Think\Behavior{ //行为执行入口 public function run(&$param){ } }
行为类建议继承\Think\Behavior,必须实现run(&$param)
方法,行为是通过这个方法执行的。
行为的触发: 只要在合适的地方通过以下代码
\Think\Hook::listen('标签名'[,参数]); // 或者 // tag('标签名'[,参数]);
当应用执行到这个地方的时候将自动触发指定标签名下的所有行为类。
isten方法可以传入并且只接受一个参数,如果需要传入多个参数,请使用数组,该参数为引用传值,所以只能传入变量。 参数可以被run(&$param)
中的$param
接收。
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
相关推荐
-
ThinkPHP3.1的Widget新用法
ThinkPHP3.0版本的Widget对Action和View的支持力度是相对不够的,仅能够实现基本的模板渲染输出.而3.1版本的发布带来的多层MVC功能,给我们实现Widget的方式带来了新的思路,且看是如何实现吧. 由于ThinkPHP3.1增加了对多层MVC的支持,因此3.1版本可以支持多层的控制器功能,由此我们就可以在控制器层再增加一层:Widget层. 首先,还是在项目的Lib目录下面创建一个Widget目录,并且创建一个TestWidget类(Lib/Widget/TestWidg
-
Thinkphp 框架扩展之类库扩展操作详解
本文实例讲述了Thinkphp 框架扩展之类库扩展操作.分享给大家供大家参考,具体如下: 类库扩展 ThinkPHP的类库主要包括公共类库和应用类库,都是基于命名空间进行定义和扩展的.只要按照规范定义,都可以实现自动加载. 公共类库 公共类库通常是指ThinkPHP/Library目录下面的类库,例如: Think目录:系统核心类库 Org目录:第三方公共类库 这些目录下面的类库都可以自动加载,你只要把相应的类库放入目录中,然后添加或者修改命名空间定义. 你可以在Org/Util/目录下面添加一
-
thinkPHP下的widget扩展用法实例分析
本文实例讲述了thinkPHP下的widget扩展用法.分享给大家供大家参考,具体如下: Widget扩展用于在页面根据需要输出不同的内容,Widget扩展的定义是在项目的Lib\Widget目录下面定义Widget类库,例如下面定义了一个用于显示最近的评论的Widget: 位于Lib\Widget\ShowCommentWidget.class.php Widget类库需要继承Widget类,并且必须定义render方法实现,例如: render方法必须使用return返回要输出的字符串信息,
-
thinkPHP5框架中widget的功能与用法详解
本文实例讲述了thinkPHP5框架中widget的功能与用法.分享给大家供大家参考,具体如下: 注意:使用助手函数return view()渲染,则挂件功能会失败,必须使用return $this->fetch() 我们在使用模板的时候,一般网站的顶部(比如说导航栏,或者用户登录区域等等),以及网站的尾部footer(比如友情链接或者版权说明等等),和body区域,我们会为了简化代码,都会将这三个部分剖开分离,然后通过模板继承的方式来使用. 但是如果顶部和尾部只是单纯的html代码还好说,但是
-
ThinkPHP中Widget扩展的两种写法及调用方法详解
本文实例讲述了ThinkPHP中Widget扩展的两种写法及调用方法.分享给大家供大家参考,具体如下: Widget扩展一般用于页面组件的扩展,在页面根据需要输出不同的内容,下面介绍一下ThinkPHP中Widget的两种写法及调用 写法一: ArticlWidget.class.php文件: class ArticleWidget extends Widget { /** * * @param array $data * @return type * 调用方法:{:W('ArticleList
-
Thinkphp 框架扩展之数据库驱动常用方法小结
本文实例讲述了Thinkphp 框架扩展之数据库驱动常用方法.分享给大家供大家参考,具体如下: 数据库驱动 默认的数据库驱动位于Think\Db\Driver命名空间下面,驱动类必须继承Think\Db类,每个数据库驱动必须要实现的接口方法包括(具体参数可以参考现有的数据库驱动类库): 驱动方法 方法说明 架构方法 __construct($config='') 数据库连接方法 connect($config='',$linkNum=0,$force=false) 释放查询方法 free() 查
-
Thinkphp 框架扩展之Widget扩展实现方法分析
本文实例讲述了Thinkphp 框架扩展之Widget扩展实现方法.分享给大家供大家参考,具体如下: Widget扩展 Widget扩展一般用于页面组件的扩展. 举个例子,我们在页面中实现一个分类显示的Widget,首先我们要定义一个Widget控制器层 CateWidget,如下: namespace Home\Widget; use Think\Controller; class CateWidget extends Controller { public function menu(){
-
ThinkPHP的Widget扩展实例
ThinkPHP的Widget扩展用于根据页面需要输出不同内容,它在项目目录中的Lib/Widget下定义. 具体定义如下: class NewsListWidget extends Widget{ public function render($data){ // code... } } 需要注意: 1.Widget是一个抽象类,其中有一个抽象方法(abstract)render,必须在子类中实现: 2.Widget的render方法必须使用return返回,而不是直接输出: 3.$data是
-
Thinkphp 框架扩展之标签库驱动原理与用法分析
本文实例讲述了Thinkphp 框架扩展之标签库驱动原理与用法.分享给大家供大家参考,具体如下: 在Think\Template中标签库的体现是采用XML命名空间的方式.每个标签库对应一个标签库驱动类,每个驱动类负责对标签库中的所有标签的解析. 标签库驱动类的作用其实就是把某个标签定义解析成为有效的模版文件(可以包括PHP语句或者HTML标签),标签库驱动的命名空间位于 Think\Template\TagLib,标签库驱动必须继承Think\Template\TagLib类,例如: names
-
thinkPHP框架中layer.js的封装与使用方法示例
本文实例讲述了thinkPHP框架中layer.js的封装与使用方法.分享给大家供大家参考,具体如下: v层:(还没实现功能的) <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>添加</title> </head> <body> <form action="{
-
汉明码编码原理及校验方法分析
目录 1.奇偶校验 2.汉明码 汉明码怎么分组: 校验码的位置: 从发送者的角度,我该怎么发用上汉明码的数据呢: 我是接收者,我收到了一串汉明码,怎样用汉明码的性质来检错呢: 1.奇偶校验 我们约定一串编码里1的个数是偶数个,那么这串编码里携带的信息就是对的,否则就是错的.我们可以在开头对这串编码加一位校验码实现奇偶校验. 例子: 我们想传输10010这串码,那么在传输的时候,就传010010,其中在开头的0就是校验位. 我们想传输10000这串码,那么在传输的时候,就传110000,其中在开头
-
Thinkphp 框架扩展之行为扩展原理与实现方法分析
本文实例讲述了Thinkphp 框架扩展之行为扩展原理与实现方法.分享给大家供大家参考,具体如下: 系统核心提供的标签位置包括下面几个(按照执行顺序排列): app_init 应用初始化标签位 path_info PATH_INFO检测标签位 app_begin 应用开始标签位 action_name 操作方法名标签位 action_begin 控制器开始标签位 view_begin 视图输出开始标签位 view_parse 视图解析标签位 template_filter 模板内容解析标签位 v
-
ThinkPHP框架实现session跨域问题的解决方法
ThinkPHP的session跨域问题很多开发者都遇到过! 其实不管是ThinkPHP还是php本身,在解决session跨域问题的时候都需要设置session.cookie_domain. 在ThinkPHP里,需要修改配置文件conf/config.php 在第一行加上: ini_set('session.cookie_domain', ".domain.com");//跨域访问Session 经过总结,针对session跨域这一问题的解决方法主要有以下几种: 第一种情况:如果你
-
thinkphp3.2框架集成QRcode生成二维码的方法分析
本文实例讲述了thinkphp3.2框架集成QRcode生成二维码的方法.分享给大家供大家参考,具体如下: 一.下载QRcode源代码 https://sourceforge.net/projects/phpqrcode/files/releases/ 使用phpqrcode必须开启GD2扩展,phpqrcode提供了一个png()方法,通过该方法,我们可以生成自已需要的二维码.该函数定义如下: public static function png( $text, $outfile = fals
-
JS浅拷贝和深拷贝原理与实现方法分析
本文实例讲述了JS浅拷贝和深拷贝原理与实现方法.分享给大家供大家参考,具体如下: 浅拷贝只会拷贝一层,深层的引用类型改变还是会受到影响. 深拷贝是所有内部的属性还有值都被拷贝了一份,不管深层的引用类型怎么改都不会受到影响. 浅拷贝的实现方式 1.自定义函数 function shallowClone (initalObj) { var obj = {}; for ( var i in initalObj) { obj[i] = initalObj[i]; } return obj; } 2.ES
-
thinkPHP显示不出验证码的原因与解决方法分析
本文实例讲述了thinkPHP显示不出验证码的原因与解决方法.分享给大家供大家参考,具体如下: 今天到公司,svn update代码后,在浏览器上输入域名后,在验证码那块显示不出,找了半个上午,后来仔细看了下apache的配置文件 <VirtualHost *:80> ServerName admin.exam.com DocumentRoot E:/www/exam/trunk/server/Admin/ <Directory E:/www/exam/trunk/server/apps
-
tp5框架前台无限极导航菜单类实现方法分析
本文实例讲述了tp5框架前台无限极导航菜单类实现方法.分享给大家供大家参考,具体如下: 适用于 id name pid sort 类似结构的表结构 使用方法:(tp5) 1.将最下面的代码保存到"前台"控制器目录下(名为 FrontNav.php),比如(路径): application/index/controll(应用/模块/控制器) 2.在控制器中使用:(application/index/controll/index)(应用/模块/控制器/方法) 也可以放到基础类的初始化方法中
-
javascript深拷贝的原理与实现方法分析
本文实例讲述了javascript深拷贝的原理与实现方法.分享给大家供大家参考,具体如下: 要讲JavaScript的拷贝,就得先讲讲javascript中的值传递和引用传递. javascript中没有一个具体的语法来规定哪些参数是引用传递,而其他语言中都有明文规定,比如 C# 中的 ref 和 PHP 中的 & . 这也是javascript众多弊端中的一个. 我们先看看下面这段代码: //值传递 var i = 3; var j = i; j = 4; document.write(i);
-
Android4.4开发之电池低电量告警提示原理与实现方法分析
本文实例讲述了Android4.4电池低电量告警提示原理与实现方法.分享给大家供大家参考,具体如下: 之前版本的电池电量低是通过发送 intent ACTION_BATTERY_LOW来实现的,而在android4.4中,通过发送intent ACTION_BATTERY_CHANGED,也就是电池电量只要变化就检查是否需要低电量告警,并且实现挪到了PowerUI中. 路径: frameworks/base/packages/SystemUI/src/com/android/systemui/p
随机推荐
- Java使用JavaMail API发送和接收邮件的代码示例
- ES6新特性一: let和const命令详解
- js删除Array数组中指定元素的两种方法
- 一个经典的ADO.NET入门例子
- ASP.NET中常用的三十三种代码第1/7页
- ASP.NET4 GridView的四种排序样式详解
- Asp.net,C# 加密解密字符串的使用详解
- 通过mysql show processlist 命令检查mysql锁的方法
- mysql中将null值转换为0的语句
- crontab每10秒执行一次的实现方法
- 配合AJAX天气预报的webService 之asp
- 常见的javascript跨域通信方法
- JavaScript Array扩展实现代码
- jQuery实现Flash效果上下翻动的中英文导航菜单代码
- 详解Spring Boot 使用Spring security 集成CAS
- 深入解析Android中的RecyclerView组件
- 哈希表实验C语言版实现
- 详解Android Gradle插件3.0挖坑日记
- Android Studio报:“Attribute application@theme or @ icon ”问题的解决
- Python2.7下安装Scrapy框架步骤教程