概念
行为:
在应用执行过程中的一个操作,例如路由检测、静态缓存等
钩子:
行为发生作用的位置,例如在应用执行前或模板输出之后
使用分析
设置钩子:
Hook::listen('钩子名称','参数','是否只有一次有效返回值');
- think\Hook.php
/**
* 监听标签的行为
* @access public
* @param string $tag 标签名称
* @param mixed $params 传入参数
* @param bool $once 只获取一个有效返回值
* @return mixed
*/
public function listen($tag, $params = null, $once = false)
{
$results = [];
//获取该钩子绑定的行为
$tags = $this->get($tag);
//按先后的顺序执行行为
foreach ($tags as $key => $name) {
$results[$key] = $this->execTag($name, $tag, $params);
if (false === $results[$key] || (!is_null($results[$key]) && $once)) {
break;
}
}
return $once ? end($results) : $results;
}
绑定行为
//单个绑定
Hook::add('app_init','app\\index\\behavior\\CheckLang');
//批量绑定
Hook::add('app_init',['app\\index\\behavior\\CheckAuth','app\\index\\beha
vior\\CheckLang','app\\admin\\behavior\\CronRun']);
- think\Hook.php
/**
* 动态添加行为扩展到某个标签
* @access public
* @param string $tag 标签名称
* @param mixed $behavior 行为名称
* @param bool $first 是否放到开头执行
* @return void
*/
public function add($tag, $behavior, $first = false)
{
isset($this->tags[$tag]) || $this->tags[$tag] = [];
if (is_array($behavior) && !is_callable($behavior)) {
if (!array_key_exists('_overlay', $behavior)) {
$this->tags[$tag] = array_merge($this->tags[$tag], $behavior);
} else {
unset($behavior['_overlay']);
$this->tags[$tag] = $behavior;
}
} elseif ($first) {
array_unshift($this->tags[$tag], $behavior);
} else {
$this->tags[$tag][] = $behavior;
}
}