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 分页类 扩展代码
Jun 11 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
解析php入库和出库
Jun 25 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
php计算title标题相似比的方法
Jul 29 PHP
php实现过滤字符串中的中文和数字实例
Jul 29 PHP
Zend Framework教程之Zend_Layout布局助手详解
Mar 04 PHP
CI框架数据库查询缓存优化的方法
Nov 21 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
Feb 16 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 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
人大复印资料处理程序_查询篇
2006/10/09 PHP
php防注入,表单提交值转义的实现详解
2013/06/10 PHP
php实现httpRequest的方法
2015/03/13 PHP
PHP输出日历表代码实例
2015/03/27 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
canvas轨迹回放功能实现
2017/12/20 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
ES6 class的应用实例分析
2019/06/27 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
Python生成验证码实例
2014/08/21 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
斯福泰克软件测试面试题
2015/02/16 面试题
计算机求职信
2013/12/01 职场文书
校园活动策划方案
2014/06/13 职场文书
2014年药店工作总结
2014/11/20 职场文书
浅析NIO系列之TCP
2021/06/15 Java/Android