应用文件详解

创建于 2022-05-26 / 最近更新于 2022-05-26 / 781
字体: [默认] [大] [更大]

通过PESCMS提供的快捷工具创建第一个应用后。定位\Plugin\demo目录,可以明确看到plugin.ini 和 Init.php 两个必备核心文件。下面开始详解应用插件的各个文件。

图片

plugin.ini 文件详解

在应用运行层中,我们用编辑器打开plugin.ini文件。

[plugin]
version = 0.0.1
name = 我的第一个应用插件
enname= demo
content = 这是我编写的第一个应用插件
author = PESCMS
website = https://www.pescms.com
;应用插件在什么组别下可运行。同时,控制器也需要依据填写的组别进行创建。
GROUP = Ticket
;应用插件是否有配置信息可填写。0:表示没有 1:表示有配置信息可填写
option = 0
;应用插件的启用状态。默认为 disabled禁用
status = disabled

plugin.ini 文件主要定义应用插件的基本信息。

注意:enname必须与插件目录一致

其次GROUP声明的运行组,决定运行的控制器也需要在应用运行层中对应的组目录。如现在声明了Ticket组。那么您创建的控制器必定是 Plugin\Demo\Ticket....

Init.php 文件详解

在应用运行层中,我们用编辑器打开Init.php文件,并写入如下代码

<?php
namespace Plugin\demo;
use \Core\Plugin\PluginController,
       \Core\Plugin\PluginImplements;
 
class Init extends PluginController implements PluginImplements {
 
    /**
     * 插件选项
     * @return mixed|void
     */
    public function option() {
        //plugin.ini 中 option = 1,那么在此处调用您需要用户填写的配置信息。
    }
 
 
    /**
     * 启用插件
     * @return mixed|void
     */
    public function enabled() {
 
        $config = $this->loadConfig($this);
        $config['plugin']['status'] = 'enabled';
        
        //更新plugin.ini中的启用状态,同时注册对应的事件绑定。
        (new \Core\Plugin\Plugin())->updateConfig($this, $config)->register("\\Plugin\\Demo\\Ticket\\Index", [
            'toolEvent' => [
                'index' => 'Ticket-Menu-index',
            ],
        ]);
        $this->success('插件启用成功');
    }
 
    /**
     * 禁用插件
     * @return mixed|void
     */
    public function disabled() {
 
        $config = $this->loadConfig($this);
        $config['plugin']['status'] = 'disabled';
 
        //更新plugin.ini中的启用状态,同时注销对应的事件绑定。
        (new \Core\Plugin\Plugin())->updateConfig($this, $config)->unRegister('\\Plugin\\Demo\\Ticket\\Index');
        $this->success('插件禁用成功');
    }
 
    /**
     * 删除插件
     * @return mixed|void
     */
    public function remove(){
        $plugin = new \Core\Plugin\Plugin();
        
        //移除插件同时注销对应的事件绑定。
        $removeFile = $plugin->unRegister('\\Plugin\\Demo\\Ticket\\Index')->remove($this);
        if($removeFile !== true){
            $this->error("移除插件时出错! {$removeFile['msg']}");
        }
 
        $plugin->unRegister($this);
 
        $this->success('插件已被删除');
    }
    
    /**
     * 安装应用插件执行的方法
     * @return mixed|void
     */
    public function install() {
        //填写插件安装时必要的运行信息。
    }
 
    /**
     * 升级插件
     * @return mixed|void
     */
    public function upgrade(){
    }
 
}

首先,我们创建了一个Init类,依次继承PluginController类 和 实现PluginImplements接口

PluginImplements接口

其中PluginImplements接口,定义了6个Init必须实现的方法:

方法名称 功能说明
option plugin.ini中, option =1 则在此处填写您的配置信息
enabled 应用插件启用时,注册相应的事件绑定等动作。
disabled 应用插件禁用时,注销相应的事件绑定等动作。
remove 应用插件被删除,同时注销相应的事件绑定等动作。
install 应用插件首次安装时触发的安装部署行为。
upgrade 应用插件升级时触发的对应修改行为。

因此Init.php文件中,必定需要编写上述方法,如上代码所示。

enabled和disabled

接下来,我们了解一下enabled和disabled两个方法中关于 事件绑定和事件注销。

public function enabled() {
 
    $config = $this->loadConfig($this);
    $config['plugin']['status'] = 'enabled';
 
    (new \Core\Plugin\Plugin())->updateConfig($this, $config)->register("\\Plugin\\Demo\\Ticket\\Index", [
        'toolEvent' => [
            'index' => 'Ticket-Menu-index',
        ],
    ]);
    $this->success('插件启用成功');
}

$this->loadConfig($this); 作用是读取当前应用插件的 plugin.ini的信息

接下来直接一个链式操作,去更新配置信息 updateConfig($this, $config)

最后进行相应的事件绑定 register('事件绑定对应的应用插件控制器', '注册事件绑定类型');

相对地,disabled方法的unRegister('事件绑定对应的应用插件控制器')则是进行解除绑定了。

范围绑定事件

什么是范围绑定事件?例如,我想应用插件在前台所有页面都可以调用,这时候就需要范围绑定事件了。PESCMS系列软件都提供了三个占位符(:g、:m、:a) 给您进行范围绑定事件。我们以注册事件绑定代码为例说明:

//在所有运行组别,只要存在控制器Menu,且方法为index,则执行toolEvent事件绑定。
register("\\Plugin\\Demo\\Ticket\\Index", [
    'toolEvent' => [
        'index' => ':g-Menu-index',
    ],
]);
 
//在Ticket组,任意控制器,方法为index,则执行toolEvent事件绑定。
register("\\Plugin\\Demo\\Ticket\\Index", [
    'toolEvent' => [
        'index' => 'Ticket-:m-index',
    ],
]);
 
//在Ticket组,控制器为Menu,任意方法,则执行toolEvent事件绑定。
register("\\Plugin\\Demo\\Ticket\\Index", [
    'toolEvent' => [
        'index' => 'Ticket-Menu-:a',
    ],
]);
0 人点赞过