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
效果一致。
示例的行为只是做了一个非常简单的输出操作,其实行为可以做很多的事情,
比如检查访问请求、权限检查、请求对象的属性和方法注入、甚至可以进行路由拦截等等,
你唯一需要注意的就是钩子的生效时间点,以及在这个钩子可以做什么有效操作。
推荐阅读
学习内容:https:www.kancloud.cntpshopthinkphp5233345完全开发手册:https:www.kancloud.cnmanualthi ...
[详细]
蜡笔小新 2023-06-03 16:34:08
本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ...
[详细]
蜡笔小新 2024-12-17 18:59:28
在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ...
[详细]
蜡笔小新 2024-11-11 18:20:00
在PHP后端开发中,实现Nginx对ThinkPHP的URL重写及PATHINFO支持是一项常见的需求。本文详细解析了经过多次尝试和研究,最终找到的一种有效配置方法,能够确保URL_MODERewrite功能正常运行,并提供稳定的服务。此外,文章还探讨了相关配置项的具体作用及其优化建议,帮助开发者更好地理解和应用这些技术。 ...
[详细]
蜡笔小新 2024-11-04 13:40:07
ThinkPHP框架下实现文件下载功能的详细指南 ...
[详细]
蜡笔小新 2024-10-31 06:54:46
本指南详细介绍了如何从零开始搭建ThinkPHP项目环境。首先,我们将创建一个名为“test”的PHP项目,并导入ThinkPHP框架。接下来,配置单入口文件,确保项目能够正确运行。ThinkPHP作为一个基于单一入口模式的PHP框架,简化了开发流程。通过本文,读者将学会如何高效地设置和测试ThinkPHP项目。 ...
[详细]
蜡笔小新 2024-10-29 10:57:03
已经把php.ini里能删的都删的差不多了,可问题依然存在报错行:实际行:995所在行:现在设断点都设不了,设在某一行,结果在其他行停下了(我用的zenddebu ...
[详细]
蜡笔小新 2023-07-18 11:00:08
这篇文章主要介绍windows2008r2+php5.6.28环境搭建的示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!安装IIS71、 ...
[详细]
蜡笔小新 2023-06-12 13:51:40
thinkphp5中取消了3.2版本中的单字母函数,初用tp5可能不大适应,下边给出两者的对应参照表,以便查阅。3.2版本5.0版本 ...
[详细]
蜡笔小新 2023-05-25 13:16:45
本文详细介绍了如何在PHP中进行数组删除、清空等操作,并提供了在Visual Studio Code中创建PHP文件的步骤。 ...
[详细]
蜡笔小新 2024-12-22 11:04:28
本文详细探讨了ThinkPHP5.1框架中自定义标签的创建与使用方法,包括标签库的建立、模板配置以及在实际项目中的应用技巧。 ...
[详细]
蜡笔小新 2024-12-09 17:04:36
ThinkPHP框架提供了add方法来实现在数据库表中插入新记录的功能,此方法等效于SQL语句中的INSERT INTO命令。本文将详细介绍add方法的使用方式及其应用场景。 ...
[详细]
蜡笔小新 2024-12-05 13:15:56
本文深入探讨了ThinkPHP框架中的文件缓存类实现,提供了详细的代码示例和使用说明,旨在帮助开发者更好地理解和利用这一功能来优化应用程序性能。 ...
[详细]
蜡笔小新 2024-12-02 17:26:54
本文探讨了PHP中使用命名空间和自动加载机制的重要性,特别是在大型项目中,如何有效管理和加载文件,避免代码冗余,提高开发效率。 ...
[详细]
蜡笔小新 2024-12-01 10:13:58
本文详细探讨了如何根据不同的应用场景选择合适的PHP版本,包括多版本切换技巧、稳定性分析及针对WordPress等特定平台的版本建议。 ...
[详细]
蜡笔小新 2024-11-23 17:00:59