插件开发
插件安装
- 1、把插件解压到addons目录下载执行,然后打开终端执行命令安装即可
- 2、你可以执行以下命令对插件进行操作,然后你也可以手动调配置进行安装。
// 插件安装 name是插件名称
php think addon install [name]
// 插件卸载
php think addon uninstall [name]
// 插件启用
php think addon enabled [name]
// 插件禁用
php think addon disabled [name]
// 示例说明: 比如你要安装一个为curd的插件
php think addon install curd
插件结构(一)
- PS: 此目录结构也可称为“应用插件”, app文件夹下内容会安装后就会迁移到app目录下面
├─📂 curd // 插件名称
│ ├─📂 app // 应用目录 (app目录内容会迁移到对应的app下)
│ │ ├─📂 api // 接口应用
│ │ │ ├─📂 controller // 控制器
│ │ │ ├─📂 service // 服务层
│ │ │ ├─📂 validate // 验证层
│ │ │ ├─📂 view // 视图层
│ │ ├─📂 backend // 后台应用
│ │ ├─📂 frontend // 前端应用
│ │
│ ├─📂 public // 此文件夹中所有文件会覆盖到根目录的/public文件夹
│ │
│ ├─📄 config.php // 插件配置文件
│ ├─📄 Plugin.php // 插件类的文件
│ ├─📄 service.ini // 插件服务文件
│ ├─📄 install.sql // 安装SQL
│ ├─📄 uninstall.sql // 卸载SQL
插件结构(二)
- PS: 此目录结构也可称为“独立插件”, 因为控制器相关代码不会进行迁移
├─📂 curd // 插件名称
│ ├─📂 controller // 控制器
│ ├─📂 model // 模型
│ ├─📂 service // 服务类
│ ├─📂 validate // 验证器
│ ├─📂 view // 视图
│ ├─📂 public // 此文件夹中所有文件会覆盖到根目录的/public文件夹
│ │
│ ├─📄 config.php // 插件配置文件
│ ├─📄 Plugin.php // 插件类的文件
│ ├─📄 service.ini // 插件服务文件
│ ├─📄 install.sql // 安装SQL
│ ├─📄 uninstall.sql // 卸载SQL
插件结构(三)
- PS: 此目录结构也可称为“独立插件”, 因为控制器相关代码不会进行迁移
├─📂 curd // 插件名称
│ ├─📂 backend // 后台应用
│ │ ├─📂 controller // 控制器
│ │ ├─📂 model // 模型
│ │ ├─📂 service // 服务类
│ │ ├─📂 validate // 验证器
│ │ ├─📂 view // 视图
│ ├─📂 frontend // 前台应用
| | ...
│ ├─📂 public // 此文件夹中所有文件会覆盖到根目录的/public文件夹
│ │
│ ├─📄 config.php // 插件配置文件
│ ├─📄 Plugin.php // 插件类的文件
│ ├─📄 service.ini // 插件服务文件
│ ├─📄 install.sql // 安装SQL
│ ├─📄 uninstall.sql // 卸载SQL
插件文件
<?php
namespace addons\curd;
use app\common\utils\MenuUtils;
use Exception;
use wait\Addons;
class Plugin extends Addons
{
private string $module = 'curd';
public function install(): bool
{
$menus = [
[
'name' => $this->module,
'title' => 'Curd',
'perms' => 'addons/curd/gen/index',
'icon' => 'layui-icon icon-seckill-flash',
'is_menu' => 1,
'is_disable' => 0,
'children' => [
['title'=>'生成列表', 'perms'=>'addons/curd/gen/index', 'is_menu'=>0, 'is_disable'=>0],
['title'=>'查看库表', 'perms'=>'addons/curd/gen/tables', 'is_menu'=>0, 'is_disable'=>0]
]
]
];
MenuUtils::create($menus);
return true;
}
public function uninstall(): bool
{
MenuUtils::delete($this->module);
return true;
}
public function enabled(): bool
{
MenuUtils::enable($this->module);
return true;
}
public function disabled(): bool
{
MenuUtils::disable($this->module);
return true;
}
}
插件信息
name = curd // 插件标识
title = 代码生成器 // 插件标题
description = 一键代码模板生成器 // 插件描述
author = windy // 插件作者
version = 1.0.1 // 插件版本
install = 1 // 是否安装: 1=是, 0=否
status = 1 // 是否启用: 1=是, 0=否
插件配置
<?php
return [
'status' => [
'title' => '启用前台:',
'type' => 'radio',
'rule' => 'required',
'content' => [
'1' => 'open',
'0' => 'close'
],
'value' => 1,
'msg' => '',
'tips' => ''
],
'image' = [
...
]
]
插件钩子
- 创建好插件后就可以在正常业务中使用该插件中的钩子了 使用钩子的时候第二个参数可以省略
<div>{:hook('testhook', ['id'=>1])}</div>
hook('testhook', ['id'=>1])
内置函数
hook(string $event, $params = null, bool $once = false);
addons_url(string $url = '', $param = [], $suffix = true, $domain = false);
addons_path(string $name='');
get_addons_instance(string $name)
get_addons_config($name);
get_addons_class(string $name, string $type = 'hook', $class = null, string $module = 'index');
get_addons_list();
get_addons_info(string $name);
set_addons_info($name, $array);
set_addons_config($name, $array);
refresh_addons_config();
get_source_assets_dir(string $name);
get_target_assets_dir(string $name);
is_really_writable(string $dir);
数据库设计
安装数据库
CREATE TABLE `__PREFIX__addons_article` (
`id` int(10) UNSIGNED NOT NULL,
`title` varchar(20) DEFAULT NULL COMMENT '标题',
`status` tinyint(1) DEFAULT '1' COMMENT '状态',
`sort` smallint(6) DEFAULT '50' COMMENT '排序',
`is_delete` tinyint(6) NOT NULL DEFAULT '0' COMMENT '是否删除: 0=否, 1=是',
`create_time` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(10) NOT NULL DEFAULT 0 COMMENT '更新时间',
`delete_time` int(10) NOT NULL DEFAULT 0 COMMENT '删除时间',
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章表';
卸载数据库
drop table if exists `__PREFIX__article`;
drop table if exists `__PREFIX__article_category`;