完善扩展插件机制

This commit is contained in:
2020-04-13 10:40:47 +08:00
parent 6560f723cd
commit 53ccc5f123
11 changed files with 167 additions and 142 deletions

View File

@@ -18,7 +18,8 @@ class Addons extends \think\Model {
protected $insert = ['create_time'];
protected $type = [
'hooks' => 'json'
'hooks' => 'json',
'config' => 'json'
];
protected function setStatusAttr($value) {
@@ -90,16 +91,15 @@ class Addons extends \think\Model {
return $admin;
}
public function install($data) {
public static function install($data) {
if ($data) {
$info = $this->where('name', $data['name'])->value('id');
if ($info) {
$result = $this->save(array('isinstall'=>1, 'status'=>1), array('id'=>$info));
}else{
$result = false;
$id = self::where('name', strtolower($data['name']))->value('id');
$result = false;
if ($id) {
$result = self::update(['isinstall'=>1, 'status'=>1], ['id'=>$id]);
}
if (false !== $result) {
return model('Hooks')->addHooks($data['name']);
return Hooks::addHooks(strtolower($data['name']));
}else{
return false;
}
@@ -108,16 +108,16 @@ class Addons extends \think\Model {
}
}
public function uninstall($id) {
$info = $this->get($id);
public static function uninstall($id) {
$info = self::find($id);
if (!$info) {
$this->error = "无此插件!";
return false;
}
$class = get_addon_class($info['name']);
$class = get_addons_class($info['name']);
if (class_exists($class)) {
//插件卸载方法
$addons = new $class;
$addons = get_addons_instance($info['name']);
if (!method_exists($addons, 'uninstall')) {
$this->error = "插件卸载方法!";
return false;
@@ -125,9 +125,9 @@ class Addons extends \think\Model {
$result = $addons->uninstall();
if ($result) {
//卸载挂载点中的插件
$result = model('Hooks')->removeHooks($info['name']);
$result = Hooks::removeHooks($info['name']);
//删除插件表中数据
$this->where(array('id' => $id))->delete();
$info->save(['isinstall' => 0]);
return true;
} else {
$this->error = "无法卸载插件!";

View File

@@ -19,6 +19,12 @@ class Hooks extends \think\Model {
return isset($type[$data['type']]) ? $type[$data['type']] : '';
}
protected function setAddonsAttr($value){
if (!empty($value[0])) {
return implode(",", $value[0]);
}
}
public static function getaddons($addons){
if (isset($addons['addons']) && $addons['addons']) {
$hook_list = explode(',', $addons['addons']);
@@ -37,4 +43,45 @@ class Hooks extends \think\Model {
];
return $keylist;
}
public static function addHooks($name){
// 读取插件目录及钩子列表
$base = get_class_methods("\\sent\\Addons");
// 读取出所有公共方法
$methods = (array)get_class_methods("\\addons\\" . $name . "\\Plugin");
// 跟插件基类方法做比对,得到差异结果
$hooks = array_diff($methods, $base);
$row = self::where('name', 'IN', $hooks)->column("*", "name");
$save = [];
foreach ($hooks as $value) {
if (isset($row[$value]) && !empty($row[$value])) {
$info = $row[$value];
$addons = $info['addons'] ? explode(",", $info['addons']) : [];
empty($addons) ? [$name] : array_push($addons, $name);
$info['addons'] = implode(",", $addons);
$save[] = $info;
}else{
$save[] = ['name' => $value, 'type' => 1, 'create_time' => time(), 'status' => 1, 'addons'=> $name];
}
}
return (new self())->saveAll($save);
}
public static function removeHooks($name){
$row = self::where('addons', 'LIKE', '%'.$name.'%')->select()->toArray();
$save = [];
foreach ($row as $value) {
$addons = explode(",", $value['addons']);
if (in_array($name, $addons)) {
array_splice($addons, array_search($name, $addons), 1);
}
$value['addons'] = !empty($addons) ? implode(",", $addons) : "";
$save[] = $value;
}
if (!empty($save)) {
return (new self())->saveAll($save);
}else{
return true;
}
}
}