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
PHP3 safe_mode 失效漏洞
Oct 09 PHP
php 购物车实例(申精)
May 11 PHP
谷歌音乐搜索栏的提示功能php修正代码
May 09 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
Jun 29 PHP
分享一个Laravel好用的Cache宏
Mar 02 PHP
PHP实现的文件上传类与用法详解
Jul 05 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 PHP
php实现微信企业转账功能
Oct 02 PHP
PHP配置ZendOpcache插件加速
Feb 14 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 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
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
php数组总结篇(一)
2008/09/30 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
Django Admin 实现外键过滤的方法
2017/09/29 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
pandas数据集的端到端处理
2019/02/18 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
介绍一下Mysql的存储引擎
2015/02/12 面试题
大学生个人自荐信样本
2014/03/02 职场文书
建筑安全生产目标责任书
2014/07/23 职场文书
四大名著读书笔记
2015/06/25 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书