phalapi框架改进方案,在一套phalapi系统上,管理多套api应用

版本:PhalApi 2.2.3

请自行安装好PhalApi,然后按照步骤,作如下修改。

修改思路:在src/app/Api目录下,根据需要,创建若干个api应用,每个应用以文件夹的形式存在,然后根据每个api的应用名称,创建对应的数据库配置文件。

涉及到的文件如下:

修改1:config/di.php

原来的notorm实例化操作如下:

// 数据操作 - 基于NotORM
$di->notorm = new NotORMDatabase($di->config->get('dbs'), $di->debug);

将上面的实例化操作,替换为如下代码:

// 获取当前api使用的数据库配置
$curDbConfig = 'dbs';
$appService = isset($_REQUEST['service']) ? $_REQUEST['service'] : $_REQUEST['s'];
// 有子命名空间时,使用该子命名空间对应的数据库,规则:config/db_子命名空间.php
if (strpos($appService,'_') !== false) {
    $serviceTmp = explode('.',$appService);
    $className = explode('_',($serviceTmp[0] == 'App' ? $serviceTmp[1] : $serviceTmp[0]));
    $curDbConfig = sprintf('db_%s',strtolower($className[0]));
}
define('CURRENT_DB_CONFIG',$curDbConfig);
// 数据操作 - 基于NotORM
$di->notorm = new NotORMDatabase($di->config->get($curDbConfig), $di->debug);

修改2:vendor/phalapi/kernal/src/Model/NotORMModel.php

修改其中的 loadTableKeys 方法,替换内容如下:

protected function loadTableKeys() {
        $tables = \PhalApi\DI()->config->get(sprintf('%s.tables',CURRENT_DB_CONFIG));
        if (empty($tables)) {
            throw new InternalServerErrorException(\PhalApi\T(sprintf('%s.tables should not be empty',CURRENT_DB_CONFIG)));
        }

        foreach ($tables as $tableName => $tableConfig) {
            static::$tableKeys[$tableName] = $tableConfig['key'];

            // 分表的主键
            foreach ($tableConfig['map'] as $mapItem) {
                if (!isset($mapItem['start']) || !isset($mapItem['end'])) {
                    continue;
                }

                for ($i = $mapItem['start']; $i <= $mapItem['end']; $i ++) {
                    static::$tableKeys[$tableName . '_' . $i] = $tableConfig['key'];
                }
            }
        }
    }

修改3:在config目录下,创建每个api应用对应的数据库配置文件,配置文件的命名规则为:db_应用名称.php,内容可以参考原来的dbs.php文件。

修改4:在src/app/Api目录下,根据需要,创建若干个api应用,每个应用,对应一个文件夹。目录结构如下:

至此,phalapi已可以支持多个数据库多套api应用的管理,最后看下文档列表界面:

猜你喜欢

转载自blog.csdn.net/tdcqfyl/article/details/81363965