# 控制器 插件控制器基于ThinkPHP6的控制器,请查看webman `控制器` 章节 请参考:https://www.workerman.net/doc/webman/controller.html ## 核心控制器 swiftadmin框架的插件基于PHP事件机制的设计,我们需要在插件开发中,插件优先继承\app\PluginControll控制器 ``` <?php namespace plugin\worker; use app\PluginController; // 继承插件控制器 /** * */ class Worker extends PluginController { /** * 插件安装方法 * @return bool */ public function install(): bool { return true; } /** * 插件卸载方法 * @return bool */ public function uninstall(): bool { return true; } /** * 插件启用方法 * @return bool */ public function enabled(): bool { return true; } /** * 插件禁用方法 * @return bool */ public function disabled(): bool { return true; } } ``` ### 前端请求 以当前 `工单管理系统` 为例,请记住我们走的是默认webman的所有控制器路由操作,所以你前端的控制器文件应为你的插件文件夹,例如 `worker` 路径会在 `\app\index\controller\worker\index.php ` 为当前插件的前端首页,那么访问当前控制器的路由地址应为 `https://www.doamin.com/worker/index/index` ### 后端请求 后端请求跟前端的没有区别,请按照TP6官方文档去编写对应的控制器文件即可 ### 基类控制器 基类控制器是插件系统的一部分,在基类控制器进行了一系列的操作,包括插件控制器权限检查、语言包加载、布局设定、配置加载等操作。 ## 模型类 SWIFTADMIN插件中的模型使用方法完全同ThinkPHP的模型使用相同,请直接参考ThinkPHP官方文档 `模型` 章节。 请参考:https://www.kancloud.cn/manual/thinkphp6_0/1037580 定义一个模型类很简单,例如下面是一个 `User` 模型: ``` <?php namespace app\model; use think\Model; class User extends Model { } ``` >请确保你已经在数据库配置文件中配置了数据库连接信息,如不清楚请参考数据库一章 模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,例如: |模型名 |约定对应数据表(假设数据库的前缀定义是 `sa_` ) | |:--| |User |sa_user | |UserType |sa_user_type | 如果你的规则和上面的系统约定不符合,那么需要设置Model类的数据表名称属性,以确保能够找到对应的数据表。 >模型自动对应的数据表名称都是遵循小写+下划线规范,如果你的表名有大写的情况,必须通过设置模型的 `table` 属性。 如果你希望给模型类添加后缀,需要设置 `name` 属性或者 `table` 属性。 ``` <?php namespace app\model; use think\Model; class UserModel extends Model { protected $name = 'user'; } ``` ### 公共模型类 公共模型类的路径为 `\app\common\model\ ` 命名空间下,公共模型类大多数为系统自带的模型, 所以建议尽量不要去写公共模型类,避免跟其他插件冲突,并在插件app文件夹下的任何模型类, 请确保你的模型的命名空间正确,例如当前 `工单系统` 的模型类 ``` <?php declare (strict_types = 1); namespace app\admin\model\worker; use think\Model; /** * 工单管理系统模型类 * <!--Worker--> * @mixin Model */ class Worker extends Model { // 自动写入时间戳字段 protected $autoWriteTimestamp = 'int'; // 定义时间戳字段名 protected $createTime = 'create_time'; protected $updatetime = 'update_time'; /** * 字段修改器 * @param $value * @return int|mixed */ public function setSortAttr($value) { if (is_empty($value)) { return self::max('id') + 1; } return $value; } } ``` 非必要的情况下,请尽量将模型存储在 `app/admin/model/worker` 文件夹内进行全局调用,也就是当前插件系统的模型类 `集合` 统一管理 ## 模板视图 由于我们当前的设计,是基于TP原生的控制器加载,那么视图章节可以参考TP的View类! 请直接参考ThinkPHP6官方文档 `视图` 章节。参考:https://www.kancloud.cn/manual/thinkphp6_0/1037608 ## 第三方包加载 ### 第一种方式 如果我们引入的第三方类库是一个 `composer` 包,例如阿里云OSS的第三方类库,由于体积庞大并且已经提前写好了命名空间 如果手动修改类库的命名空间工作量过大时,我们可以通过在行为中载入命名空间。比如我们需要引入 `OssClient` 阿里云OSS云上传类库。 首先我们下载这个源码包,把源码包中的 `src` 中的代码拷贝到 `plugin/worker/library/oss` 这个目录下,如图:  首先我们在 `Worker.php` 中use命名空间 ``` use OSS\OssClient; use OSS\Core\OssException; use Composer\Autoload\ClassLoader; ``` 然后增加一个插件初始化的钩子 ``` /** * 插件初始化 * @return void */ public function loadLibrary() { try { if (!class_exists('OSS')) { $loader = new ClassLoader(); $loader->addPsr4('OSS\\', PLUGIN_PATH . 'alioss/library/OSS'); $loader->register(true); } } catch (\Throwable $th) {} } ``` ### 第二种方式 如果有些第三方包是依赖于其他第三方包的情况下,我们建议使用原始的composer包加载的方式 1、你可以在执行composer require进行第三方包的安装,例如框架自带的支付、微信包 2、如果你的包体积比较小,并且你想指定包的版本,那么在单独的文件夹使用composer require来安装之后 这时候你会获取到一个vendor文件夹,然后将他复制到插件的根目录下或者library目录下,在插件钩子文件中,使用如下方式来进行导入 >如图  ## 跨域访问 1、这里只是处理API接口的跨域,如果你引用的图片产生的跨域问题,则需要你自行在你的服务器进行配置跨域。 2、建议按需开放允许跨域的IP或域名。 3、如果你在开发uniapp的时候设置跨域不成功,可以使用谷歌浏览器安装关闭跨域插件进行测试! ## 常见问题 如果在引用时出现类未找到,请检查类的命名空间是否正确,其次请检查目录、文件、类名大小写是否正确。 插件开发引用类库,请全部使用命名空间的方法,请勿使用 `require` 或 `include` 进行载入。 我们期望的是开发者可以在类Linux的环境下进行PHP代码的开发,这样可以提早发现错误,避免线上BUG的产出过多,影响用户体验度 更新于 2026-08-09 15:52 阅读 2 ← 插件配置 插件事件 → 相关问题 插件简介 新建插件 插件目录 插件配置 插件事件 插件菜单 插件数据库 代码生成