ThinkPHP5行为和钩子-02
作者:吴燕凤怡雨家琴 | 来源:互联网 | 2023-09-06 18:37
绑定行为要给钩子绑定行为有两种方式:配置绑定和动态绑定。配置绑定配置绑定是在应用目录或者模块目录下面的tags.php文件中配置,app_init和app_begin钩子只能在应用目录下面的tag
绑定行为
要给钩子绑定行为有两种方式:配置绑定和动态绑定。
配置绑定
配置绑定是在应用目录或者模块目录下面的 tags.php文件中配置,app_init和app_begin钩子只
能在应用目录下面的 tags.php文件中配置模块目录下面配置无效,而其它的钩子支持应用和模块配置,
如果同时定义的话,会合并后依次执行行为。
以我们上面定义的两个行为为例,配置方式如下:
return [
'app_init' => ['\app\common\behavior\Hello','\app\common\behavior\Test',],
'app_begin' => ['\app\common\behavior\Test',],
'module_init' => [function($request){
echo 'hello,'.$request->module().'!';
},],
];
假设我们的控制器类如下:
namespace app\index\controller;
class Index
{
public function index()
{
return 'run index ';
}
}
当我们访问URL
http://contoso.org
后,页面输出结果为:
hello,world! app_init testapp_begin testhello,index! run index
配置绑定的行为执行顺序就是配置的定义顺序,我们修改下配置文件里面的定义顺序如下:
return [
'app_init' => ['\app\common\behavior\Test','\app\common\behavior\Hello',],
'app_begin' => ['\app\common\behavior\Test',],
'module_init' => [function($request){
echo 'hello,'.$request->module().'!';
},],
];
最终输出的结果变成:
app_init testhello,world! app_begin testhello,index! run index
如果我希望app_init钩子的Test行为执行后不再继续执行后续的行为,可以修改 Test行为类如下:
namespace app\common\behavior;
class Test
{
public function appInit()
{
echo 'app_init test ';
return false;
}
public function appBegin()
{
echo 'app_begin test';
return false;
}
}
再次访问的时候,输出结果就变成了
app_init testapp_begin testhello,index! run index
我们看到,app_init钩子绑定的 Hello行为没有被执行。
现在我们在模块的tags.php文件中添加行为绑定
return [
'module_init' => [function($request){
echo 'welcome,'.$request->module().'!';
},],
];
再次访问后页面输出结果为:
app_init test app_begin test hello,index! welcome,index! run index
可见 modue_init钩子上的应用绑定行为和模块绑定行为同时生效了,
如果希望当前模块的行为覆盖应用绑定的行为,可以使用:
return [
'module_init' => [function($request){
echo 'welcome,'.$request->module().'!';
},
'_overlay' => true,],
];
再次访问后,查看页面输出结果变成:
app_init testapp_begin testwelcome,index! run index
module_init钩子只执行了模块的行为。
我们给 Test行为增加一个额外的方法并且也绑定到 module_init钩子
namespace app\common\behavior;
class Test
{
public function appInit()
{
echo 'app_init test ';
return false;
}
public function appBegin()
{
echo 'app_begin test ';
return false;
}
public function sayHello($request)
{
echo 'say hello ' . $request->module() . '!';
}
}
V5.0.4+版本开始支持指定方法(包括静态方法执行行为)
因为sayHello方法和钩子名称( module_init对应的方法名应该是 moduleInit)不一致,
所以我们在绑定行为的时候需要改为:
return [
'module_init' => [function($request){
echo 'welcome,'.$request->module().'!';
},
['\app\common\behavior\Test','sayHello'],],
];
再次访问页面输出:
app_init test app_begin test hello,index! welcome,index!say hello index! run index
如果sayHello是一个静态方法的话,绑定方式需要从原来的
['\app\common\behavior\Test','sayHello'],
改为:
'\app\common\behavior\Test::sayHello',
动态绑定
配置方式绑定行为理解之后,我们再来看下如何动态绑定某个行为,动态绑定是指使用 Hook::add方法
动态给钩子添加一个行为方法,格式:
Hook::add('钩子名称','行为定义','是否优先执行');
如果行为需要在应用里面被绑定,就在应用的公共文件 common.php中使用动态绑定代码,如果是模块的绑定行为,
那么也可以在模块的 common.php文件中使用动态绑定。
保持行为类不变的前提下,我们把前面的配置绑定方式改成动态绑定的方式,
首先在 application/common.php中添加如下代码:
use think\Hook;
Hook::add('app_init',['\app\common\behavior\Test','\app\common\behavior\Hello', ]);
Hook::add('app_begin',['\app\common\behavior\Test', ]);
Hook::add('module_init',[function($request){
echo 'hello,'.$request->module().'!';
},]
);
在 application/index/common.php中添加如下代码:
use think\Hook;
Hook::add('module_init',[function($request){
echo 'welcome,'.$request->module().'!';
},
['\app\common\behavior\Test','sayHello'],
]
);
然后清空应用和模块的tags.php文件内容,再次访问测试下,输出结果为:
app_init test app_begin test hello,index! welcome,index!say hello index! run index
效果一致。
示例的行为只是做了一个非常简单的输出操作,其实行为可以做很多的事情,
比如检查访问请求、权限检查、请求对象的属性和方法注入、甚至可以进行路由拦截等等,
你唯一需要注意的就是钩子的生效时间点,以及在这个钩子可以做什么有效操作。
推荐阅读
后端开发|php教程apache配置文件,thinkphp后端开发-php教程例如你的原路径是http:localhosttestindex.phpindexadd那么现在的地址是 ...
[详细]
蜡笔小新 2023-10-15 18:00:01
本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ...
[详细]
蜡笔小新 2023-12-13 20:01:16
基于注解的DI注入1.导包环境搭建:导入aop包(spring-aop-4.1.6.RELEASE.jar)2.创建类3.创建spring.xml配置文件(必须在src目录下)该配 ...
[详细]
蜡笔小新 2023-10-17 11:53:29
支持无限极遍历子文件及文件夹,支持绝对路径和相对路径!函数说明:arrayglob(string$pattern[,int$flags]) ...
[详细]
蜡笔小新 2023-10-14 23:19:03
jQueryFileUpload是一个Jquery图片上传组件,支持多文件上传、取消、删除,上传前缩略图预览、列表显示图片大小,支持上传进度条显示;支 ...
[详细]
蜡笔小新 2023-10-14 16:37:16
动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的 ...
[详细]
蜡笔小新 2023-10-13 10:10:41
本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ...
[详细]
蜡笔小新 2023-12-11 19:42:30
IssuesonGithubaremeantforbugreporting.Pleasepostfeaturerequestsonthe ...
[详细]
蜡笔小新 2023-10-15 11:53:36
环境:thinkphp_3.2.3_fullphp5.6.27以上下载thinkphp3.2.2解压到http:www.tptest.com网站的根目录下并访问网址& ...
[详细]
蜡笔小新 2023-10-14 19:52:54
|Questions|Answers|-------------|----------------------------------------- ...
[详细]
蜡笔小新 2023-10-13 18:16:38
XmlHttpRequest.open()里的URL要怎么书写控制器里的代码如下:publicfunctioncheck(){ ...
[详细]
蜡笔小新 2023-10-13 17:35:10
本文目录一览:1、码云gitee利用PHP脚本拉取实现自动部署(可用于生产环境) ...
[详细]
蜡笔小新 2023-10-13 14:03:02
试用一下ThinkPHP5.1这最新版的TP框架,创建项目很简单,在web根目录使用composer搞定:composercreate-p ...
[详细]
蜡笔小新 2023-10-13 12:03:43
什么是系统服务?系统服务是对于程序要用到的类在使用前先进行类的标识的绑定,以便容器能够对其进行解析(通过服务类的 register 方法),还有就是初始化一些参数、注册路由等(不限 ...
[详细]
蜡笔小新 2023-10-13 11:51:08
参考了这篇文章:https:segmentfault.comq1010000000473230后报错误:GettingError“Formsubmissioncanceledbec ...
[详细]
蜡笔小新 2023-10-13 11:33:14