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 相关文章推荐
BBS(php & mysql)完整版(八)
Oct 09 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 PHP
php获取汉字首字母的函数
Nov 07 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
PHP获取服务器端信息的方法
Nov 28 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
Zend Framework分页类用法详解
Mar 22 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
Aug 07 PHP
laravel 框架执行流程与原理简单分析
Feb 01 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
fgetcvs在linux的问题
2012/01/15 PHP
file_get_contents("php://input", "r")实例介绍
2013/07/01 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
Laravel路由研究之domain解决多域名问题的方法示例
2019/04/04 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
layui table数据修改的回显方法
2019/09/04 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
python文件与目录操作实例详解
2016/02/22 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
pandas取出重复数据的方法
2019/07/04 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
西班牙伏林航空公司:Vueling
2016/08/05 全球购物
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
影视动画专业个人的自我评价
2013/12/31 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
通知范文怎么写
2015/04/16 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书