插件开发

插件安装

  • 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

插件文件

  • 即Plugin.php文件
<?php
namespace addons\curd;

use app\common\utils\MenuUtils;
use Exception;
use wait\Addons;

class Plugin extends Addons
{
    /**
     * 插件名称
     * @var string
     */
    private string $module = 'curd';

    /**
     * 插件安装方法
     *
     * @throws Exception
     * @return bool
     */
    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;
    }

    /**
     * 插件卸载方法
     *
     * @throws Exception
     * @return bool
     */
    public function uninstall(): bool
    {
        MenuUtils::delete($this->module);
        return true;
    }

    /**
     * 插件启用方法
     *
     * @return bool
     * @throws Exception
     */
    public function enabled(): bool
    {
        MenuUtils::enable($this->module);
        return true;
    }

    /**
     * 插件禁用方法
     *
     * @return bool
     */
    public function disabled(): bool
    {
        MenuUtils::disable($this->module);
        return true;
    }
}

插件信息

  • 即service.ini文件
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>

// php业务中使用
hook('testhook', ['id'=>1])

内置函数

/**
 * 处理插件钩子事件
 *
 * @param string $event 钩子名称
 * @param array|null $params 传入参数
 * @param bool $once 是否只返回一个结果
 * @return mixed
 */
hook(string $event, $params = null, bool $once = false);

/**
 * 插件显示内容里生成访问插件的url
 *
 * @param string $url 地址格式:插件名/模块/控制器/方法 或者只有方法
 * @param array $param
 * @param bool|string $suffix 生成的URL后缀
 * @param bool|string $domain 域名
 * @return bool|string
 */
addons_url(string $url = '', $param = [], $suffix = true, $domain = false);

/**
 * 获取插件基础目录
 *
 * @param string $name 插件名称
 * @return string
 */
addons_path(string $name='');

/**
 * 获取插件的单例 (即Plugin.php文件的实例化对象)
 *
 * @param string $name 插件名
 * @return mixed|null
 */
get_addons_instance(string $name)

/**
 * 获取插件的配置
 *
 * @param $name (插件名称)
 * @return array
 */
get_addons_config($name);

/**
 * 获取插件类的类名
 *
 * @param string $name    插件名
 * @param string $type   返回命名空间类型
 * @param null $class    当前类名
 * @param string $module 模块名
 * @return string
 */
get_addons_class(string $name, string $type = 'hook', $class = null, string $module = 'index');

/**
 * 获取本地插件列表
 *
 * @return array
 */
get_addons_list();

/**
 * 读取插件基础信息
 *
 * @param string $name 插件名
 * @return array
 */
get_addons_info(string $name);

/**
 * 设置插件信息
 *
 * @param $name   (插件名称)
 * @param $array  (插件数据)
 * @return bool
 * @throws Exception
 * @author windy
 */
set_addons_info($name, $array);

/**
 * 设置插件配置
 *
 * @param $name  (插件名称)
 * @param $array (配置数组)
 * @return bool
 * @throws Exception
 */
set_addons_config($name, $array);

/**
 * 刷新插件配置
 *
 * @return bool
 * @throws @\Symfony\Component\VarExporter\Exception\ExceptionInterface
 */
refresh_addons_config();

/**
 * 获取插件原始资源目录
 *
 * @param string $name (插件名称)
 * @return string
 */
get_source_assets_dir(string $name);

/**
 * 获取插件目标资源目录
 *
 * @param string $name (插件名称)
 * @return string
 */
get_target_assets_dir(string $name);

/**
 * 是否有写入权限
 *
 * @param string $dir
 * @return bool
 */
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`;
上次更新:
贡献者: zero, windy, windy