(1)Hook钩子类似于event事件监听

系统自带的钩子函数,在application目录下的tags.php文件中可以注册

也可以使用Hook::add()添加

Hook::listen()相当于是标签位,Hook::add()则相当于是对标签位相应的实现。

所以要确保Hook::add(),在Hook::listen()之前执行,不然就没什么用处了。

钩子函数既可以单独绑定一个类,也可以绑定类中的一个方法,或者直接绑定一个匿名函数。
当绑定到一个类时,如果类中有run函数,那就直接执行run函数,如果没有run函数,而有一个与钩子名一样的函数则会执行该函数。
(注意:钩子函数是驼峰式命名,并且钩子函数名的优先级大于run函数的优先级)

示例:
在正常的的程序之外想要改动少的增加一些别的功能

现在admin模块下的behavior下创建Ceshi.php文件

钩子里面的方法的命名规范 驼峰写法

(注意:如果一个钩子名称绑定了多个行为,从左往右执行,如果中间那一层hook返回了false ,啧当前的钩子执行完这个行为之后的行为都无法被触发,但是原程序继续执行)

//Ceshi.php 钩子,当前的行为类演示多个行为的情景

<?
namespace app\admin\behavior;

class Ceshi
{

    /**************行为类只有一个行为*********************/

    /* public function run()
    {
        echo 'only one';
        return true;
    }*/


    /**********************类里面有多个行为,按下面写**************************/
    public function initTest($params)
    {
        echo 'this is hook 1';
        dump($params);
        return true;
    }

    public function initTest2($params)
    {
        echo 'this is hook 2';
        dump($params);
        return true;
    }
}

1,动态绑定钩子

/*测试controller*/

<?
namespace app\admin\controller;

use think\facade\Hook;

class Index
{
    //绑定多个行为类,动态绑定
    public function getHooke()
    {
        //动态绑定加这个
        Hook::add('init_test', ["app\\admin\\behavior\\Ceshi"]);
        Hook::add('init_test2', "app\\admin\\behavior\\Ceshi");

    //调用,当程序执行到这里时就会调用app\\admin\\behavior\\Ceshi里面的init_test行为方法
        Hook::listen('init_test', ['name' => 'wawa']);
        Hook::listen('init_test2', ['age' => 20]);
        echo '成功';
    }

}

2,配置文件绑定钩子直接运用应用下的钩子或者模块下的钩子,本文直接用的是app应用下的配置

打开app\tag.php 文件

<?php

// 应用行为扩展定义文件
return [
    // 应用初始化
    'app_init'     => [],
    // 应用开始
    'app_begin'    => [],
    // 模块初始化
    'module_init'  => [],
    // 操作开始执行
    'action_begin' => [],
    // 视图内容过滤
    'view_filter'  => [],
    // 日志写入
    'log_write'    => [],
    // 应用结束
    'app_end'      => [],

    //钩子名称映射
    'init_test'    => [
        app\admin\behavior\Ceshi::class
    ],
    'init_test2'   => [
        app\admin\behavior\Ceshi::class
    ],

];

调用直接看index.php的那个方法,也是listen

文档更新时间: 2021-06-09 20:43   作者:admin