前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >教你如何编写webman基础插件,打造自己的PHP插件包

教你如何编写webman基础插件,打造自己的PHP插件包

作者头像
Tinywan
发布2024-01-10 15:13:03
2450
发布2024-01-10 15:13:03
举报
文章被收录于专栏:开源技术小栈开源技术小栈

基础插件是什么?

基础插件是一些通用组件,一般使用composer安装,代码放置于vendor下。安装的时候可以将一些自定义的配置(中间件、进程、路由等配置)自动拷贝到{主项目}config/plugin目录下,webman会自动识别该目录配置并将配置合并到主配置当中,从而让插件可以介入到webman的任何生命周期当中。

编写插件

1、安装webman框架

代码语言:javascript
复制
composer create-project workerman/webman webman2024

2、安装 console命令行

代码语言:javascript
复制
composer require webman/console

webman/console 是一个webman命令行工具,更多了解请参考这里:https://www.workerman.net/plugin/1

3、创建插件

这里以创建一个tinywan/encryption插件,以AES高级加密标准为准,主要场景适用于和其他语言进行加解和解密

AES 全称为 Advanced Encryption Standard,即高级加密标准,是一种常用密钥加密的块算法。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。

注意:

  1. 插件名由两部分组成,厂商名插件名,例如这里厂商名是tinywan,插件名是encryption
  2. 厂商名插件名是后面composer要发布的项目名,名称需要小写。
创建插件命令
代码语言:javascript
复制
php webman plugin:create --name=tinywan/encryption

创建插件后会生成目录 vendor/tinywan/encryption 用于存放插件相关文件 和 config/plugin/tinywan/encryption 用于存放插件相关配置。

vendor/tinywan/encryption 目录结构

代码语言:javascript
复制
├── vendor
│   ├── autoload.php
│   ├── tinywan
│   │   └── encryption
│   │       ├── composer.json
│   │       └── src

config/plugin/foo/admin 目录结构

代码语言:javascript
复制
.
├── app
│   ├── plugin
│   │   ├── tinywan
│   │   │   └── encryption
│   │   │       └── app.php

配置文件说明

  • app.php 主配置文件
  • bootstrap.php 进程启动配置文件
  • route.php 路由配置文件
  • middleware.php 中间件配置文件
  • process.php 自定义进程配置文件
  • database.php 数据库配置文件
  • redis.php redis配置文件
  • thinkorm.php thinkorm 数据库配置文件
  • database.php 数据库配置文件

配置格式与webman相同,这些配置会自动被webman识别合并到配置当中。使用时以 plugin 为前缀访问,例如 config('plugin.tinywan.encryption.app');

4、开发插件

开发插件在插件的生成目录vendor/tinywan/encryption下进行编写。由于开发该插件需要借助于openssl扩展,所以需要在composer.json配置文件指定一下依赖"ext-openssl": "*"同时限制安装该扩展包PHP版本必须大于等于7.4

最终composer.json内容如下

代码语言:javascript
复制
{
  "name": "tinywan/encryption",
  "type": "library",
  "license": "MIT",
  "description": "Webman plugin tinywan/encryption",
  "require": {
    "php": "^7.4",
    "ext-openssl": "*"
  },
  "autoload": {
    "psr-4": {
      "Tinywan\\Encryption\\": "src"
    }
  }
}

加解密主文件Encryption.php编写,注意该文件需要的vendor/tinywan/encryption/src目录下进行编写

Encryption.php文件

代码语言:javascript
复制
<?php
/**
 * @desc Encryption
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/1/4 9:28
 */

declare(strict_types=1);

namespace Tinywan\Encryption;


class Encryption
{
    /** AES-128-ECB 加密方式*/
    public const AES_128_ECB = 'AES-128-ECB';

    /**
     * @desc 加密
     * @param string $data 加密的数据
     * @param string $key 密钥,必须是16、24或32个字符长度
     * @param string $algo 加密方式
     * @param string $iv 初始向量(IV)
     * @return string
     * @author Tinywan(ShaoBo Wan)
     */
    public static function encrypt(string $data, string $key, string $algo = self::AES_128_ECB, string $iv = ''): string
    {
        $encryptedBytes = openssl_encrypt($data, $algo, $key, OPENSSL_RAW_DATA);
        return base64_encode($encryptedBytes);
    }

    /**
     * @desc 解密
     * @param string $data
     * @param string $key 密钥,必须是16、24或32个字符长度
     * @param string $algo 加密方式
     * @param string $iv 初始向量(IV)
     * @return false|string
     * @author Tinywan(ShaoBo Wan)
     */
    public static function decrypt(string $data, string $key, string $algo = self::AES_128_ECB, string $iv = '')
    {
        return openssl_decrypt(base64_decode($data), $algo, $key, OPENSSL_RAW_DATA);
    }
}

注:以上的命名空间需要和composer.jsonpsr-4命名空间保持一致

5、导出插件

当开发完插件后,执行以下命令导出插件

代码语言:javascript
复制
php webman plugin:export --name=tinywan/encryption

输出以下内容

代码语言:javascript
复制
Export Plugin
Create /home/www/build/webman2024/vendor/tinywan/encryption/src/Install.php
Copy config/plugin/tinywan/encryption to /home/www/build/webman2024/vendor/tinywan/encryption/src/config/plugin/tinywan/encryption 
Saved tinywan/encryption to /home/www/build/webman2024/vendor/tinywan/encryption

导出说明

  1. 导出后会将config/plugin/tinywan/encryption目录拷贝到vendor/tinywan/encryption/src下,同时自动生成一个Install.phpInstall.php用于自动安装和自动卸载时执行一些操作。
  2. 安装默认操作是将vendor/tinywan/encryption/src 下的配置拷贝到当前项目config/plugin
  3. 移除时默认操作是将 当前项目config/plugin下的配置文件删除
  4. 你可以修改Install.php以便在安装和卸载插件时做一些自定义操作。

导出后的目录结构

代码语言:javascript
复制
vendor
├── autoload.php
├── tinywan
│   └── encryption
│       ├── composer.json
│       └── src
│           ├── config
│           │   └── plugin
│           │       └── tinywan
│           │           └── encryption
│           │               └── app.php
│           ├── Encryption.php
│           └── Install.php

6、发布插件

这里发布插件,就是把基础插件包通过Composer发布到官方仓库。更多了解:如何发布一个自己的Composer依赖包

Composer是 用PHP开发的用来管理项目依赖的工具,当你在项目中声明了依赖关系后,composer可以自动帮你下载和安装这些依赖库,并实现自动加载代码。

  1. Github 新建一个公共仓库encryption
  2. 推送本地基础插件包到远程仓库
代码语言:javascript
复制
cd webman2024/vendor/tinywan/encryption

echo "# ddd" >> README.md
git init
git add ./
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:Tinywan/encryption.git
git push -u origin main
  1. 登录https://packagist.org/ 提交插件包

注:提交地址为Github仓库地址

  1. 在自己的代码仓库https://github.com/Tinywan/encryption/releases/new发布一个releasesv1.0.0

重新查看https://packagist.org/packages/tinywan/encryption页面点击 Update 按钮更新版本,可以看到刚才发布的v1.0.0的版本已经更新到官方仓库了

7、使用插件

使用基础插件就是可以正常使用composer包一样简单喔!

安装

代码语言:javascript
复制
composer require tinywan/encryption

使用

代码语言:javascript
复制
require __DIR__ . '/../vendor/autoload.php';

$key = '4d7f2e7fe8e450385253bf379b13e432';

$encrypt = \Tinywan\Encryption\Encryption::encrypt('开源技术小栈',$key);
echo '加密结果:'.$encrypt. PHP_EOL;

$decrypt = \Tinywan\Encryption\Encryption::decrypt($encrypt,$key);
echo '解密结果:'.$decrypt. PHP_EOL;

打印结果

代码语言:javascript
复制
加密结果:cmmXBbPpzjZmhP9lAB80IV793zRy++ZfqzD3VNEO0Gk=
解密结果:开源技术小栈
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础插件是什么?
  • 编写插件
  • 1、安装webman框架
  • 2、安装 console命令行
  • 3、创建插件
    • 创建插件命令
    • 4、开发插件
    • 5、导出插件
    • 6、发布插件
    • 7、使用插件
    相关产品与服务
    消息队列 TDMQ
    消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档