(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