插件钩子

本框架的插件钩子,请采用驼峰法函数的方式去编写,首字母小写,

以下是系统默认自带的一些钩子,有一些是预留的,请勿使用;

序号 钩子 类型 描述
1 apiAuth 插件 API插件鉴权钩子,插件独占
2 userLoginSuccess 系统 用户登录成功触发钩子
3 cmsHotSearch 插件 CMS热词搜索插件,插件独占
4 cmscategoryPermissions 插件 CMS栏目权限插件,插件独占
5 smsMsgSend 系统 短信发送的钩子,用于阿里云/腾讯云短信发送
6 uploadFileAfter 系统 附件上传后执行的钩子
7 uploadFileMultipart 系统 大文件分片上传/每个分片上传后
8 adminLoginError 系统 后台管理员登录错误
9 adminLoginSuccess 系统 后台管理员登录成功/可以对接微信公众号提醒
10 userLoginError 系统 用户登录成功触发钩子
以上钩子中,系统的钩子可以编写插件进行数据的调用执行/返回,插件独占的钩子是专为官方开发插件预留的

如果以上的钩子不满足你的需求,可以加群68221484提交反馈,我们可以增加一些你业务上常用的钩子/事件

使用事件时在 Worker.php 中添加上对应的方法,在安装时、禁用、启用即可自动注册行为。但一定请注意在 Worker.php 中编写事件访问为 public 类型

监听事件

当前以工单管理系统为例,文件路径在/plugin/worker/Worker.php,文件内容如下

<?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;
    }

    /**
     * 文件上传事件
     * @param $param
     * @return void
     */
    public function uploadFileAfter($param)
    {
        // TODO ..
       
    }
}

uploadFileAfter 事件钩子,这样在初始化的时候,框架会监听这个钩子的调用,其实你就把他理解为一个插槽

当用户需要的时候,会去检查这个钩子是否存在,如果存在则执行这个函数。

触发事件

我们拿当前这个上传函数的事件来举例说明,当前框架已经监听到这个事件了,那么要如何触发?

例如:用户头像上传后,我们需要上传至阿里云等附件存储空间,那么则需要这样去触发事件来执行,

/**
 * 用户头像上传
 * @param object $file
 * @return array|false
 */
public function avatar(object $file)
{
    $this->getFileSavePath($file, 'avatars');
    if (!$file->move($this->filepath, $this->filename)) {
        $this->setError('请检查服务器读写权限!');
        return false;
    }

    $this->Images->thumb($this->filepath, $this->filename, $this->config, true);

    Event::emit('uploadFileAfter', [
        'fileName' => $this->filename,
        'resource' => $this->resource
    ]);

    $this->uploadAfterDelete();

    return $this->success('文件上传成功!',  $this->resource);
}

触发事件执行的方式有很多,但基本上最后执行的都是一样的,所以请统一使用Event::emit触发即可

常见问题

最后更新时间:2022-12-02 17:34:01652
https://doc.swiftadmin.net/developer/53.html