控制器
插件控制器基于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的产出过多,影响用户体验度