thinkphp5.1 框架钩子和行为用法实例分析


Posted in PHP onMay 25, 2020

本文实例讲述了thinkphp5.1 框架钩子和行为用法。分享给大家供大家参考,具体如下:

行为

ThinkPHP中的行为是一个比较抽象的概念,可以把行为想象成在应用执行过程中的一个动作。

在框架的执行流程中,例如路由检测是一个行为,静态缓存是一个行为,用户权限检测也是行为,大到业务逻辑,小到浏览器检测、多语言检测等等都可以当做是一个行为,甚至说你希望给你的网站用户的第一次访问弹出Hello,world!这些都可以看成是一种行为,把这些行为抽离出来的目的是为了让你无需改动框架和应用,而在外围通过扩展或者配置来改变或者增加一些功能。

钩子

不同的行为之间也具有位置共同性,比如,有些行为的作用位置都是在应用执行前,有些行为都是在模板输出之后,我们把这些行为发生作用的位置称之为钩子

当应用程序运行到这个钩子的时候,就会被拦截下来,统一执行相关的行为

一个钩子可以注册多个行为,执行到某个钩子位置后,会按照注册的顺序依次执行相关的行为。但在某些特殊的情况下,你可以设置某个钩子只能执行一次行为,又或者你可以在一个钩子的某个行为中返回false来强制终止后续的行为执行;一个行为可以同时注册到多个不同的钩子上,完全看应用的需求来设计。

设置钩子:

Hook::listen('钩子名称','参数','是否只有一次有效返回值');

除了钩子名称之外,其它参数都是可选的,注意5.1版本第二个参数不支持引用传值。

行为定义

行为类的定义很简单,一般来说只需要定义一个行为入口方法run即可

可以在行为方法中使用依赖注入

行为类并不需要继承任何类,相对比较灵活。如果行为类需要绑定到多个钩子,可以定义多个方法

行为绑定

行为定义完成后,就需要绑定到某个标签位置才能生效,否则是不会执行的。

使用think\facade\Hook类的add方法注册行为,例如:

// 注册 app\index\behavior\CheckLang行为类到app_init标签位
Hook::add('app_init','app\\index\\behavior\\CheckLang'); 
//注册 app\admin\behavior\CronRun行为类到app_init标签位
Hook::add('app_init','app\\admin\\behavior\\CronRun');

如果要批量注册行为的话,可以使用:

Hook::add('app_init',['app\\index\\behavior\\CheckAuth','app\\index\\behavior\\CheckLang','app\\admin\\behavior\\Cr

当应用运行到app_init标签位的时候,就会依次调用app\index\behavior\CheckAuthapp\index\behavior\CheckLangapp\admin\behavior\CronRun行为。如果其中一个行为中有中止代码的话则后续不会执行,如果返回false则当前标签位的后续行为将不会执行,但应用将继续运行。

闭包支持

可以不用定义行为直接把闭包函数绑定到某个标签位,例如:

Hook::add('app_init',function(){ 
  echo 'Hello,world!';
});

如果标签位有传入参数的话,闭包也可以支持传入参数,例如:

Hook::listen('action_init',$params);
Hook::add('action_init',function($params){ 
  var_dump($params);
});

直接执行行为

如果需要,也可以不绑定行为标签,直接调用某个行为,使用:

// 执行 app\index\behavior\CheckAuth行为类的run方法 并引用传入params参数
$result = Hook::exec('app\\index\\behavior\\CheckAuth',$params);

直接执行行为的时候,执行的是run方法,如果需要执行行为类的其它方法,可以使用

// 执行 app\index\behavior\CheckAuth行为类的hello方法 并引用传入params参数
$result = Hook::exec(['app\\index\\behavior\\CheckAuth','hello'], $params);

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP新手上路(三)
Oct 09 PHP
PHP5 安装方法
Jan 15 PHP
php curl的深入解析
Jun 02 PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 09 PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 #PHP
php7 错误处理机制修改实例分析
May 25 #PHP
php7 list()、session及其他模块的修改实例分析
May 25 #PHP
php7 新增功能实例总结
May 25 #PHP
PHP强制转化的形式整理
May 22 #PHP
Yii 框架入口脚本示例分析
May 19 #PHP
Yii 框架使用数据库(databases)的方法示例
May 19 #PHP
You might like
提升PHP执行速度全攻略(上)
2006/10/09 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
yii操作cookie实例简介
2014/07/09 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
用Python编写一个简单的FUSE文件系统的教程
2015/04/02 Python
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
Python中bisect的用法及示例详解
2020/07/20 Python
python 解决函数返回return的问题
2020/12/05 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
如何用PHP实现邮件发送
2012/12/26 面试题
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
销售自我评价
2013/10/22 职场文书
食堂个人先进事迹
2014/01/22 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
自我检讨书怎么写
2015/05/07 职场文书
导游词之无锡梅园
2019/11/28 职场文书
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏