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.NET的入门教程
Oct 09 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
Jan 14 PHP
php mail to 配置详解
Jan 16 PHP
PHP把小数转成整数3种方法
Jun 30 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
Yii2实现UploadedFile上传文件示例
Feb 15 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
php通过各种函数判断0和空
Jul 04 PHP
PHP实现小程序批量通知推送
Nov 27 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
建立动态的WML站点(三)
2006/10/09 PHP
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
一文让你彻底搞清楚javascript中的require、import与export
2017/09/24 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
Python实现CET查分的方法
2015/03/10 Python
Python实现一个简单的验证码程序
2017/11/03 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
编写python代码实现简单抽奖器
2020/10/20 Python
python实现文件分片上传的接口自动化
2020/11/19 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
HTML5拖放功能_动力节点Java学院整理
2017/07/13 HTML / CSS
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
法学院方阵解说词
2014/01/29 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
Golang并发工具Singleflight
2022/05/06 Golang