在代码中埋入钩子,然后执行到埋点时,会调用钩子方法,获得结果。
而使用者可以花式实现钩子,这样代码灵活性很高。
下面是cmf如何自定义后台登陆界面的钩子使用实例
配置说明配置
文件在 vendor/thinkcmf/src/App.php 294行左右引入12行,会判断app目录下是否有tags.php文件,有则引入配置文件
$module = $module ? $module . DIRECTORY_SEPARATOR : '';
$path = $this->appPath . $module;
if (empty($module) || empty(static::$modulesInited[$module])) {
// 加载初始化文件
if (is_file($path . 'init.php')) {
include $path . 'init.php';
} elseif (is_file($this->runtimePath . $module . 'init.php')) {
include $this->runtimePath . $module . 'init.php';
} else {
// 加载行为扩展文件
if (is_file($path . 'tags.php')) {
$tags = include $path . 'tags.php';
if (is_array($tags)) {
$this->hook->import($tags);
}
}
配置文件如下
return [
'admin_login' => [
'app\\portal\\behavior\\AdminLoginBehavior',
],
];
指定钩子执行的方法(数组类型)。钩子可以有多个执行方法,按照数组中顺序执行
实现钩子
class AdminLoginBehavior
{
protected static $run = false;
// 行为扩展的执行入口必须是run
public function run()
{
if (self::$run) {
return;
}
self::$run = true;
$view = View::instance();
$view->assign('site_info', cmf_get_option('site_info'));
return $view->fetch(":login");
}
}
入口函数为run方法,其他无特殊要求
其他说明
上面是自定义后台登陆页面的钩子实现
埋点代码在vendor/thinkcmf/cmf-app/src/admin/controller/PublicController.php 38行左右下面第6行。即为钩子埋点
$admin_id = session('ADMIN_ID');
if (!empty($admin_id)) {//已经登录
return redirect(url("admin/Index/index"));
} else {
session("__SP_ADMIN_LOGIN_PAGE_SHOWED_SUCCESS__", true);
$result = hook_one('admin_login');
if (!empty($result)) {
return $result;
}
return $this->fetch(":login");
}
cmf钩子文档
https://www.kancloud.cn/thinkcmf/doc5_1/963034
cmf后台有很多钩子,按照返回值定义,返回指定的返回值类型即可