Skip to content

Commit

Permalink
Update Plugin.php
Browse files Browse the repository at this point in the history
  • Loading branch information
walkor authored Mar 23, 2022
1 parent 84514a9 commit a7e95f0
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions support/Plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ class Plugin
public static function install($event)
{
static::findHepler();
$autoload = $event->getOperation()->getPackage()->getAutoload();
$operation = $event->getOperation();
$autoload = method_exists($operation, 'getPackage') ? $operation->getPackage()->getAutoload() : $operation->getTargetPackage()->getAutoload();
if (!isset($autoload['psr-4'])) {
return;
}
Expand All @@ -19,6 +20,11 @@ public static function install($event)
}
}

public static function update($event)
{
static::install($event);
}

public static function uninstall($event)
{
static::findHepler();
Expand Down Expand Up @@ -46,4 +52,4 @@ protected static function findHepler()
require_once __DIR__ . '/helpers.php';
}

}
}

2 comments on commit a7e95f0

@eatmeatball
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

关于webman插件系统的一些设计。

以下两个场景为例子
1、用户张三写了一个新的admin前端,想要替换调原来的默认admin
2、李四针对一些接口的插件写了限流和翻译的插件

index.php
框架加载
配置加载
- 插件1注册(webman-admin 这个插件需要注册到webman的生命周期)
- 插件2注册(翻译插件 需要对 webman-admin xxx 接口做交互更改某些返回内容 这个插件需要触发注册到webman-admin 的生命周期)
- 插件3注册(前端插件 需要对 webman-admin 前端入口做处理,返回另一套资源 这个插件需要触发注册到webman-admin 的生命周期)
- 插件4注册(限流插件 需要对 webman-admin xxx2 接口入做限流处理  这个插件需要触发注册到webman-admin 的生命周期)
框架加载运行
接受请求
处理请求
发现前端设置了另一个,使用前端(这里需要引入少量的php代码,再模板入口处做路有操作,如果发现要使用其他前端资源,通过php渲染的引入不同的js,在这个地方做一个php控制前端页面的触发点,或者以提供中间注册的方式处罚)

api
接受请求
处理接口
获取a接口request 中间件列表
- 进入限流插件

获取a接口response 中间件列表
- 进入翻译插件

关于插件的注册方式应当使用插件包内部提供的的一些reg方法,或者插件包读取config之后做出相应操作,这样隔离了插件包和开发项目之间的代码耦合。
最多让插件包可以触发在项目目录生成默认配置文件,其他的代码全都收敛到vendor内。
插件间的交互需要完善事件的触发和相关中间件的注册行为。

插件的注册方式可以使用 autoload.file 或者其他cache文件,这样之后插件的扩展会更一些。目前的copy不利于项目迭代升级和各种不同开发者插件的交互

@walkor
Copy link
Owner Author

@walkor walkor commented on a7e95f0 Aug 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感谢你的建议。

插件分两种

一种是基础插件,一种是应用插件

基础插件

类似通用的基础组件,作用于主项目,基础插件代码放置于vendor里,开发人员无需更改源码。
基础插件安装的时候可以选择是否在主项目config/plugin下插入配置,如果插入配置将介入主项目生命周期。
例如{项目目录}/config/plugin下加入中间件配置,则这个基础插件可以介入主项目请求周期,可以做到限流、翻译等。
例如{项目目录}/config/plugin下加入bootstrap配置,则可以介入到webman的整个生命周期。
例如{项目目录}/config/plugin下加入路由配置,则可以给主项目添加路由,当匹配某个路由的时候由中间件来处理。
例如{项目目录}/config/plugin下加入进程配置,则可以产生自定义进程,自定义进程能做的事情就很多了,比如消息队列。
还可以加入其它配置如redis,database等

基础插件一般不包含控制器,视图等页面逻辑,所以可以放置于vendor下,升级只需要更新vendor下的包即可。

应用插件

应用插件是一个比较完整的项目,例如商城、问答系统、CMS系统、admin后台等。
应用插件本身带控制器 视图 js css等,这些东开发者可能需要修改,无法放到vendor下。
另外后面会有开发者开发出付费的应用插件,付费应用插件不好直接用composer安装,所以不好放到vendor下。
应用插件统一放到{项目目录}/plugin/下。删除的时候只需要删除对应的目录即可。升级的话替换目录即可。
应用插件和主项目一样,有自己独立的配置。应用插件不影响主项目。应用插件之间也互不影响。
主项目和应用插件以及插件和插件之间可以通过事件来通讯,达到解耦的目的。
主项目可以添加各种应用插件,像搭积木一样搭建真个项目。

需求实现

1、用户张三写了一个新的admin前端,想要替换调原来的默认admin

这个只需要开发一个应用插件,插件里实现前端部分就好了。
每个应用插件都有一个自己的地址,访问这个前端插件的地址例如 域名.com/app/xadmin 就可以了。

2、李四针对一些接口的插件写了限流和翻译的插件

这个是基础插件,实际上是中间件,中间件里可以实现请求拦截和响应拦截,实现限流或翻译。
基础中间件使用composer安装,中间件逻辑会被安装在vendor下,安装时可以自动向{项目目录}/config/plugin里添加中间件配置,
这样就可以介入到请求周期实现限流和翻译。如果想作用于某个应用插件,需要在对应应用插件中配置中间件。

关于插件代码存放位置

基础插件代码放置于vendor下没问题,但是应用插件还是放在 {项目目录}/plugin/ 下好一些。

Please sign in to comment.