[TOC]
## 引用类库
```
use think\Hook;
use think\Loader;
use think\Config;
```
## 定义插件目录
```
define('ADDON_PATH', ROOT_PATH . 'addons' . DS); // DS是/
```
## 注册类的根命名空间
```
Loader::addNamespace('addons', ADDON_PATH);
```
## 如果插件目录不存在则创建
```
if(!is_dir(ADDON_PATH)){
@mkdir(ADDON_PATH, 0777, true);
}
```
> mkdir(path,mode,recursive)
> 如果成功该函数返回 TRUE,如果失败则返回 FALSE。
> 参数一:path必需。规定要创建的目录的名称。
> 参数二:mode可选。规定权限。默认是 0777(允许全局访问)。
> 参数三:recursive可选。规定是否设置递归模式。(PHP 5 中新增的)
## 处理插件钩子
```
/**
* 处理插件钩子
* @param [string] $hook [钩子名称]
* @param array $params [传入参数]
* @return [void]
*/
function hook($hook, $params=[]){
Hook::listen($hook, $params); //监听标签(钩子)的行为
}
```
> 函数功能:监听某个钩子,该钩子上挂载某个插件
## 自动加载钩子的配置
> 文件名:composer.json
> 代码:
```
{
"name": "cmsaddons/think-addons",
"description": "The ThinkPHP5 Addons Package",
"license": "Apache-2.0",
"authors": [
{
"name": "lyc",
"email": "lyc@studyfox.cn"
}
],
"autoload": {
"psr-4": {
"think\\": "src"
},
"files": [
"src/common.php"
]
}
}
```
> PSR是PHP Standards Recommendation的简称,制定的代码规范,简称PSR,是代码开发的事实标准。
> PSR-4使代码更加规范,能够满足面向package的自动加载,它规范了如何从文件路径自动加载类,同时规范了自动加载文件的位置。
## autoload\_psr4.php
```
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'think\\testing\\' => array($vendorDir . '/topthink/think-testing/src'),
'think\\helper\\' => array($vendorDir . '/topthink/think-helper/src'),
'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'),
'think\\' => array($vendorDir . '/cmsaddons/think-addons/src'),
);
```
## autoload\_files.php
```
<?php
// autoload_files.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'1cfd2761b63b0a29ed23657ea394cb2d' => $vendorDir . '/topthink/think-captcha/src/helper.php',
'72c97b53391125cae04082a81029f42d' => $vendorDir . '/topthink/think-testing/src/config.php',
'ddc3cd2a04224f9638c5d0de6a69c7e1' => $vendorDir . '/cmsaddons/think-addons/src/common.php',
);
```
## 插件挂载到钩子上
```
Hook::add('',''); //两个参数,钩子名,插件名
```
## TP系统内置钩子
```
app_init 应用初始化标签位
app_begin 应用开始标签位
module_init 模块初始化标签位
action_begin 控制器开始标签位
view_filter 视图输出过滤标签位
app_end 应用结束标签位
response_end 输出结束标签位(V5.0.1+)
log_write 日志write方法标签位
```
## 初始化行为,系统内置钩子
```
Hook::add('action_begin',function(){
$data = cache('hooks');
if(empty($data)){
//首页获取配置中的插件
$addons = (array)Config::get('addons');
// 初始化钩子
foreach ($addons as $key => $value) {
if(is_string($value)){
$value = explode(',',$value);
}else{
$value = (array)$value;
}
// 最终需要的效果
// Hook::add('bookhook','\addons\book\Book');
$addons[$key] = array_map('get_addon_class', $value); //array_map 将函数作用到数组中的每个值上
Hook::add($key,$addons[$key]); // 动态添加插件到某个钩子上
}
cache('hooks',$addons);
}else{
Hook::import($data,false); //批量导入插件
}
});
```
## 获取插件类的类名
```
/**
* 获取插件类的类名
* @param [type] $name 插件名
* @param string $type [命名空间类型]
* @param [type] $class [插件类名]
* @return [string]
*/
function get_addon_class($name, $type = 'hook', $class = null){
//parseName转换命名格式 ,驼峰命名 book=>book GuestBook => guest_book,后面的参数1是首字母大写
$class = Loader::parseName(is_null($class) ? $name : $class, 1);
switch($type){
case 'controller':
$namespace = "\\addons\\" . $name . "\\controller\\" . $class;
break;
default:
$namespace = "\\addons\\" . $name . "\\" . $class;
}
// 当一个类处于某个命名空间下时,class_exists必须补全命名空间
return class_exists($namespace) ? $namespace : '';
}
```
- Layer无刷新不跳转弹框提示信息
- 整合ThinkPHP+实用代码
- TP整合Layer插件实现无刷新
- 自定义助手函数
- 添加信息失败后不跳转
- 三种无限级分类
- TP常用代码
- 自定义公共函数
- TP模型管理专题
- TP模型管理之添加模型
- sfox_newmodel.sql
- TP模型管理之删除模型
- TP模型管理之编辑模型
- TP模型管理之字段添加
- sfox_newmodel.sql_edit
- layer_hplus.js_edit
- TP模型管理之字段删除
- TP模型管理之字段编辑
- TP模型管理之预览模型
- TP模型管理之公共函数
- layer_hplus.js_修订一
- TP模型管理之预览模型静态页
- 后台内容管理系统
- 分类树显示
- 内容列表显示
- 信息发布
- 编辑信息
- layer_hplus.js
- myJs第一版
- myJs第二版
- myJs第三版
- myJs第四版
- TP5插件用法
- Datatables
- WebUploader
- bootstrap-fileinput
- UEditor
- 简单调用
- 路径问题
- 跨域多图上传
- 跨域单图上传
- UEditor图片跨域上传解决方案
- 定制工具栏图标
- ajaxFileUpload
- LayUI
- 图片上传
- layui分页
- 搜索页
- 搜索优化及删除
- Uploadify
- TP5前端应用
- 静态首页
- 前台首页功能实现
- 自定义标签库
- 前台模板继承应用
- 首页自定义标签改进
- 文章内容页
- 自定义标签改进
- 自定义标签修正
- 图片等比例自动缩放
- 后台权限管理
- 角色管理
- 规则管理
- 权限设置
- 会员管理
- 权限管理
- 前台登录注册功能
- 注册登录
- 阿里大于手机注册
- 阿里大于升级阿里云短信服务
- 自动登录完成
- PHP异位或加密实现自动登陆
- 微信开发
- 分享接口
- 静态页面实现微信分享
- 动态页微信分享
- 页面静态化
- 1-全站静态化前期配置
- 2-链接地址静态化
- TP5常用片段代码
- 加载静态资源路径与常量
- thinkphp5预定义常量
- 删除某文件夹的内容
- 解压插件包
- 异步提交插件
- 其他功能
- 背景音乐
- 手机访问PC网站自动跳转到手机网站代码
- 手机微信音乐MP3播放器
- 后盾之网页背景音乐
- 播放器宽度自适应
- 前台首页数据调用
- 视频列表
- 搜索分页
- H5解决苹果(IOS)不能自动播放音乐
- 清空缓存
- 文件处理常识
- 删除路径下的所有文件夹和文件
- 一键清空缓存
- 评论留言
- 格式化时间
- 替换微博内容的URL地址@用户与表情
- PHP正则理解
- jQuery评论插件
- TP空操作
- TP路由
- 跨域访问
- 设置请其头允许跨域请求
- 模板前台判断手机访问跳转手机网址代码
- PHP遍历一个文件夹下所有文件和子文件夹
- PHP获取视频的第一帧与时长
- TP5数据库
- 链式操作原理
- update替换字段部分内容
- 后台开发
- 后台登录页居中显示
- TP5自带验证码
- JS & JQuery专题
- 二级城市联动菜单
- 模板引擎
- 混合模板编译
- 黄永成TP微博开发
- 消息推送
- memcache安装
- 插件开发
- 插件介绍
- 插件钩子
- 浅谈初步理解钩子
- 插件钩子(hooks)分析
- 插件钩子简单理解
- 控制器调用插件
- 钩子通用处理函数
- 插件基类代码
- 插件测试代码
- 浅谈钩子与插件
- 技术综合
- 常用代码
- PHP
- 56个PHP开发常用代码片段(上)
- 56个PHP 开发常用代码片段(中)
- 56个PHP 开发常用代码片段(下)
- sublime text安装自动补全注释的插件
- 影音视频开发
- 视频
- H5视频直播扫盲
- 音乐
- 语音
- PHP实现语音播报功能
- MUI
- 窗体操作