Thinkphp5中的钩子和行为

前言

钩子和行为

钩子相当于一个插件,在某些执行顺序上插入进去。

行为可以在写app 接口中对所有请求执行到控制器前 执行登录用户的权限判断、登录token验证、发送websocket推送等,这样就不用在每个接口中判断了。
注意事项:
1.触发行为的关键方法是 Hook 类中的 listen 方法,它通过遍历某个行为标签下的所有行为,依次实例化并调用 run 方法
2.listen 方法中,如果之前在配置文件中开启了 DEBUG 模式,则它会生成日志记录你的行为,这里面牵涉到很多的 IO 操作,所以你的项目完成时建议取消 DEBUG 模式以提升速度。
3.listen 方法中,允许传递参数且只允许传递一个参数(传多个可以用数组呢),不过这个参数是引用传值,所以只能传入变量,传入常量会报错。
4.listen() 加载注册的标签(如 targs.php 里的)遍历注册标签的键取出值,并且依次实例化标签键的值存放的类,执行run方法。

一:行为定义

方法1:一般写在behaviour文件夹,例如 app\index\behavior\ActionTestBehavior 类
不传递参数

<?php
//测试行为类
namespace app\behavior;
class ActionTestBehavior
{
    //run为行为的默认执行类,在有和行为标签相同名字的方法名情况下,不执行run,执行与行为标签同名的方法。
    public function run()
    {
        dump('run方法测试');
    }
	//方法名为行为标签名的驼峰写法,比如app_init,对应appInit()
    public function appAction()
    {
        dump('标签名驼峰命名法测试');
    }
}

传递参数

<?php
//测试行为类
namespace app\behavior;
class ActionTestBehavior
{
    //run为行为的默认执行类,在有和行为标签相同名字的方法名情况下,不执行run,执行与行为标签同名的方法。
    //方法名为行为标签名的驼峰写法,比如app_init,对应appInit()
	public function run($data)
    {
		dump($data);
        dump('run方法测试');
    }

    public function appAction($data)
    {
    	dump($data);
        dump('标签名驼峰命名法测试');
    }
}

方法2:闭包支持(添加行为标签时直接调用方法)

    public function testIndex()
    {
        //闭包支持
        //可以不用定义行为直接把闭包函数绑定到某个标签位
        Hook::add('action_init',function(){
            echo 'Hello,world!';
        });
        Hook::listen('action_init');
    }

闭包支持也可以进行参数绑定

    public function testIndex(Request $request)
    {
        $param = $request->only(['name','nickname','adress']);
        //如果标签位有传入参数的话,闭包也可以支持传入参数
        Hook::add('action_init',function($param){
            var_dump($param);
        });
        Hook::listen('action_init',$param);
    }
二:行为绑定(钩子绑定行为)

方法1:一般在应用目录和模块目录下面的 tags.php 里写入行为标签与行为的关联

    //测试绑定
    'action_test' => [
        \app\behavior\ActionTestBehavior::class,
    ],

如果需要调用驼峰写法的方法名需要在 tags.php 中定义如下的行为标签与行为的关联

	//测试绑定
    'app_action' => [
        \app\behavior\ActionTestBehavior::class,
    ],

方法2:控制器 Controller 中直接添加程序绑定

Hook::add('action_test',\app\behavior\ActionTestBehavior::class);

或者写在控制器中的构造方法中

    public function __construct()
    {
        parent ::__construct();
        \think\facade\Hook ::add('app_action', \app\behavior\ActionTestBehavior::class);
    }
三:钩子放置
Hook::listen('action_list'); //在需要调用行为的位置,放置钩子监听调用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值