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 相关文章推荐
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
Feb 22 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
php生成excel列序号代码实例
Dec 24 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
PHP Reflection API详解
May 12 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
Jan 08 PHP
php实现在站点里面添加邮件发送的功能
Apr 28 PHP
php查询及多条件查询
Feb 26 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
Laravel5.5 动态切换多语言的操作方式
Oct 25 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
vuejs指令详解
2017/02/07 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
Flask框架信号用法实例分析
2018/07/24 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
Html5实现首页动态视频背景的示例代码
2019/09/25 HTML / CSS
C有"按引用传递"吗
2016/09/06 面试题
商得四方公司面试题(gid+)
2014/04/30 面试题
公司门卫工作职责
2014/06/28 职场文书
2014最新离职证明范本
2014/09/12 职场文书
体检通知范文
2015/04/21 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
Java 定时任务技术趋势简介
2022/05/04 Java/Android