关于thinkphp5.1钩子和行为的个人理解和使用

hykeda5年前ThinkPHP1287

thinkphp5中的钩子和行为属于AOP编程思想,类似于AOP编程中的“切面”的概念,简单理解就是一个切入点,可以大大增加程序的耦合性。

如何使用钩子和行为来开发:

首先在项目中创建一个行为文件夹:

1、behavior 文件夹,创建Test.php 行为文件

image.png

Test.php文件中默认的行为入口方法为run:

image.png

行为的入口方法名称支持自定义,如果需要更改在应用公共文件中添加下面的代码即可:

Hook::portal('portal');

此处Hook需要引入think\facade\Hook类

入口方法名称就变成了portal而不是默认的run了。

2、在控制器Index.php中调用钩子:

调用的方式有如下几种:

1)、我们将钩子和行为进行绑定,通过tags.php文件:

image.png

这里我将zkd_login的钩子绑定到了test行为中;

在Index.php的控制器中直接监听钩子:

image.png

访问index方法,页面显示:我是一个钩子;

2)、我们不通过tags.php文件,直接在index方法中注册钩子:

image.png

访问index方法,页面显示:我是一个钩子;

也可以实例化Hook对象进行调用:

image.png

thinkphp还提供直接调用行为的方法:

image.png

具体可以参考thinkphp的文档:https://www.kancloud.cn/manual/thinkphp5_1/354129


举例说明:

如果当前注册模块已经开发完成,现在临时需要增加添加日志功能:

方法1:直接在注册方法的最后面写记录日志功能的代码:

image.png

方法2:通过钩子和行为方式实现:

image.png

记录日志操作在add_log指向的行为中进行实现。

方法3:

image.png

model类中添加log方法:

image.png

这三种方式都可以实现记录日志的功能,第一种是最普通的方式,第二种是AOP的思想进行实现,第三中是OOP的思想进行实现。

钩子行为和中间件的区别,钩子行为是针对方法,而中间件是针对控制器。中间件在控制器中设置哪个方法调用,哪个方法不用调用,在方法调用前调用还是后调用。而钩子是在方法里面,不影响原先方法执行逻辑。

相关文章

关于thinkphp6 where以数组形式查询,其中有or,and的处理

最近在写tp6的查询语句时,如果查询条件以数组形式传入,比如:$where[] = ['id','=',$id]; $where[] =...

thinkphp5.1 使用第三方类库放置在extend文件夹

thinkphp5.1 使用第三方类库放置在extend文件夹

thinkphp5.1 开发扩展类库时,命名空间必须要命名成文件夹的名字,不然无法访问到:...

thinkphp5 导入第三方类库和导入扩展类库细节

在用到tp5之后,很多东西都不太一样了。在此记录些小经验: 类库的导入,tp5有两种类库,分别为第三方类库和扩展类库 导入扩展类库,tp的手册中有示例代码: extend目录下面...

composer安装插件包的时候提示PHP 版本不匹配

因为安装的 PHP 是 8.0 ,不匹配 composer.json 要求的版本,所以使用 composer 进行安装时会报错。在安装命令后加上 --ignore-pla...

phpqrcode防止输出乱码 thinkphp

/** * 封装生成二维码函数 * */ function getQrcode($url){ /*生成二维码*/ vendor("phpqrcod...

thinkphp6 使用中的注意点

thinkphp6 使用中的注意点

1、TP6中采用多应用模式需要安装  composer require topthink/think-multi-app如果需要使用view,还必须安装模板引擎...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。