Fecmall-应用安装和加载原理

当您申请成功开发者后就可以开发应用了 ,此文档讲解的是fecmall实现应用在线安装的原理,也就是如何将应用市场的插件,在线 安装到fecmall中的,理解了这个原理,更有助于您开发fecmall引用

Fecmall应用的安装原理

1.后台应用列表

在后台,应用中心,可以看到我的应用列表(如果没有,自行去fecmall应用市场添加应用)

对应的文件为:@fecshop/app/appadmin/modules/System/controllers/ExtensionmarketController.php

可以看到,应用的信息是通过$info = Yii::$service->extension->remoteService->getMyAddonsInfo(); ,远程加载的应用市场系统的api,获取数据展示的

2.应用的安装

对应的文件为:@fecshop/app/appadmin/modules/System/controllers/ExtensionmarketController.php

public function actionInstall()
    {
        $namespace = Yii::$app->request->get('namespace');
        $packageName = Yii::$app->request->get('packageName');
        $folderName = Yii::$app->request->get('folderName');
        $addonName = Yii::$app->request->get('addonName');
        
        //  进行zip文件下载到指定的文件路径
        $zipFilePath = Yii::$service->extension->remoteService->downloadAddons($namespace, $packageName, $folderName, $addonName);
        if (!$zipFilePath) {
            echo  json_encode([
                'statusCode' => '300',
                'message'    => Yii::$service->page->translate->__('download remote addons fail'),
            ]);
            exit;
        }
        // 进行zip文件的解压
        $dest_dir = dirname($zipFilePath);
        if (!Yii::$service->helper->zipFile->unzip($zipFilePath, $dest_dir, true, true)) {
            echo  json_encode([
                'statusCode' => '300',
                'message'    => Yii::$service->page->translate->__('unzip addons fail'),
            ]);
            exit;
        }
        // 删除zip压缩包 
        unlink($zipFilePath);
        
        // 将addons信息写入数据库
        $data = Yii::$service->extension->remoteService->getAddonsInfoByNamespace($namespace);
        if (!is_array($data)) {
            echo  json_encode([
                'statusCode' => '300',
                'message'    => Yii::$service->page->translate->__('get remote addons info by namespace fail'),
            ]);
            exit;
        }
        // 将远程获取的数据,保存到数据库中。
        if (!Yii::$service->extension->newInstallInit($data)){
            echo  json_encode([
                'statusCode' => '300',
                'message'    => Yii::$service->page->translate->__('init new install addon to db fail'),
            ]);
            exit;
        }
        // 进行插件的安装
        if (!Yii::$service->extension->administer->install($namespace)) {
            $errors = Yii::$service->helper->errors->get();
            echo  json_encode([
                'statusCode' => '300',
                'message'    => Yii::$service->page->translate->__($errors),
            ]);
            exit;
        }
        // 进行插件的升级
        if (!Yii::$service->extension->administer->upgrade($namespace)) {
            $errors = Yii::$service->helper->errors->get();
            echo  json_encode([
                'statusCode' => '300',
                'message'    => Yii::$service->page->translate->__($errors),
            ]);
            exit;
        }
        // 输入安装成功信息。
        echo  json_encode([
            'statusCode' => '200',
            'message'    => Yii::$service->page->translate->__('addons install success'),
        ]);
        exit;
    }

这个是安装应用的方法,打开代码可以看到做了这些事情

1.进行zip文件下载到指定的文件路径

2.进行zip文件的解压

3.删除zip压缩包

4.将addons信息写入数据库

5.将远程获取的数据,保存到数据库中

6.进行插件的安装

7.进行插件的升级

8.完成

对于插件的安装部分,是在config.php中指定相应的文件,详细参看: Fecmall-应用Config文件

Fecmall 应用插件初始化加载原理

1.打开数据库表extensions,这个就是应用插件表,里面记录应用的安装状态,以及配置文件路径 extensions

2.在配置config初始化的时候,会加载这个表的配置,然后合并到配置中(只加载状态为激活的应用,如果 某个应用在后台关闭,那么不会被加载)

3.应用文件夹中的config.php,是应用配置文件,也就是extensions 对应的config_file_path,这个文件是约定好的,应用的入口配置文件必须是config.php

4.在初始化过程中,Fecmall的安装的所有的应用(状态激活),都会被加载 ,就会进行配置合并,最终出来的是合并后的配置

fecmall的一些重写规则可以参考下fecmall的文档: http://www.fecmall.com/doc/fecshop-guide/develop/cn-2.0/guide-fecmall-rewrite-func.html