版本: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应用的管理,最后看下文档列表界面: