控制器

插件控制器基于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 这个目录下,如图:

10.png

首先我们在 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目录下,在插件钩子文件中,使用如下方式来进行导入

如图 QQ截图20220822103335.png

跨域访问

1、这里只是处理API接口的跨域,如果你引用的图片产生的跨域问题,则需要你自行在你的服务器进行配置跨域。

2、建议按需开放允许跨域的IP或域名。

3、如果你在开发uniapp的时候设置跨域不成功,可以使用谷歌浏览器安装关闭跨域插件进行测试!

常见问题

如果在引用时出现类未找到,请检查类的命名空间是否正确,其次请检查目录、文件、类名大小写是否正确。

插件开发引用类库,请全部使用命名空间的方法,请勿使用 requireinclude 进行载入。

我们期望的是开发者可以在类Linux的环境下进行PHP代码的开发,这样可以提早发现错误,避免线上BUG的产出过多,影响用户体验度

最后更新时间:2022-08-22 10:34:331873
https://doc.swiftadmin.net/developer/52.html