前言
上次只做了初始化Yii的字模块,这次实现在模块中添加一个服务。先看一下子模块的结构吧
子模块结构
- 子模块主要有common、v1两个目录组成。common中有相关的服务、模型、代码,v1是接口的版本号,在v1下创建服务目录,每个服务的controllers中创建自己的控制器。路由规则是 版本号\服务名\控制器\方法名
├── common
│ ├── behaviors
│ │ ├── AccessBehavior.php
│ ├── caches
│ │ └── TestCache.php
│ ├── constant
│ │ └── TestConst.php
│ └── services
│ ├── model
│ │ └── TestSearch.php
│ └── TestService.php
├── config
├── README.md
├── runtime
├── v1
│ ├── Module.php
│ └── test
│ ├── controllers
│ │ └── TestController.php
│ └── Module.php
- 1、创建一个版本
- 2、创建服务目录及Controller
- 3、修改Module.php文件,注册服务
- 4、在Common下创建service、model、const等文件
- 1、为了可以自由创建版本号和控制器,对模板文件进行了修改,将版本号接口相关的定义做了几个模板语法:
%demo% : 子模块
%v1% : 版本号
%test% :服务名
%Api% : 接口控制器名称
renameSpace()
{
subName1=$1
version1=$2
serName1=$3
apiName1=$4
search1=$5
# echo "INFO: 修改命名空间 ${search}"
sed -i "" "s/%demo%/${subName1}/g" `grep "%demo%" -rl ${search1}`
sed -i "" "s/%v1%/${version1}/g" `grep "%v1%" -rl ${search1}`
#修改服务名
sed -i "" "s/%test%/${serName1}/g" `grep "%test%" -rl ${search1} `
sed -i "" "s/%Api%/${apiName1}/g" `grep "%Api%" -rl ${search1} `
}
- 3、创建新的版本目录时,将demo模板克隆下来,然后解析模板语法。
newService()
{
# 创建新版本
if [ ! -d ./${version} ]; then
cp -r tmp_sub_demo/v1 ./${version}
# 替换默认module名
renameSpace ${subName} ${version} test Test ./${version}
fi
# 创建控制器
copyController ${subName} ${version} ${serName} ${apiName}
# 创建模型
copyModels ${subName} ${version} ${serName} ${apiName}
}
- 4、创建控制器时,将模板控制复制之后,解析模板语法。如果在已有的服务中创建,直接将test示例改为目标文件。
copyController(){
subName=$1
version=$2
serName=$3
apiName=$4
upperName=`toFirstLetterUpper "${apiName}"`
echo "INFO: 添加控制器 ${subName}/${version}/${serName}/${upperName}Controller "
#修改文件名
if [ ! -f ${version}/${serName}/controllers/${upperName}Controller.php ]; then
if [ ! -d ./${version}/${serName} ]; then
# 复制新的服务
cp -r tmp_sub_demo/v1/test ./${version}/${serName}
mv ./${version}/${serName}/controllers/TestController.php ${version}/${serName}/controllers/${upperName}Controller.php
else
cp tmp_sub_demo/v1/test/controllers/TestController.php ${version}/${serName}/controllers/${upperName}Controller.php
fi
# 替换默认nameSpace名
renameSpace ${subName} ${version} ${serName} ${upperName} "./${version}/${serName}"
fi
echo "INFO: 添加控制器 done "
}
- 5、添加新模块,需要在Module.php 中注册新的服务。
public function init()
{
parent::init();
$this->modules = [
'%test%' => [
// 此处添加一个新的模块
'class' => '%demo%\%v1%\%test%\Module',
],
];
}
- 6、用shell读取文件的内容,使用正则匹配插入的新行位置,在新行注册服务。
addModule(){
version=$1
serName=$2
moduleFile="./${version}/Module.php"
newModuleFile=${moduleFile}.tmp
if [ ! -f ${moduleFile} ];then
echo "ERR:文件${moduleFile} 不存在"
fi
#新模块内容
regx='$this->modules = ['
newline=" '${serName}' => [ 'class' => 'api\\${version}\\${serName}\\Module' ],"
count=0
while read -r line #使用read命令循环读取文件内容,并将读取的文件内容赋值给变量line
do
let count++
echo "${line}" >> ${newModuleFile}
#正则匹配到行,插入新模块
if [[ ${line} =~ "${regx}" ]]
then
echo "${newline}" >> ${newModuleFile}
fi
done <${moduleFile} # “done <$file”将整个while循环的标准输入指向文件$file
#替换新的module
mv ${moduleFile} ${moduleFile}.old
mv ${newModuleFile} ${moduleFile}
echo "INFO: 子模块已经添加至 ${moduleFile} "
}
# 创建model service
copyModels(){
subName=$1
version=$2
serName=$3
apiName=$4
upperName=`toFirstLetterUpper "${apiName}"`
echo "INFO: 添加模型 ${subName}/${version}/${serName}/${upperName}Search等文件"
#修改文件名
if [ ! -f common/services/${upperName}Service.php ]; then
cp tmp_sub_demo/common/services/TestService.php common/services/${upperName}Service.php
fi
if [ ! -f common/services/model/${upperName}Search.php ]; then
cp tmp_sub_demo/common/services/model/TestSearch.php common/services/model/${upperName}Search.php
fi
if [ ! -f common/constant/${upperName}Const.php ]; then
cp tmp_sub_demo/common/constant/TestConst.php common/constant/${upperName}Const.php
fi
if [ ! -f common/caches/${upperName}Cache.php ]; then
cp tmp_sub_demo/common/caches/TestCache.php common/caches/${upperName}Cache.php
fi
# 替换默认nameSpace名
renameSpace ${subName} ${version} ${serName} ${upperName} "./common/*/${upperName}*"
echo "INFO: 添加模型 done "
}
subName=$1
version=$2
serName=$3
apiName=$4
# 参数校验
if [${subName} =='' ]
then
echo "--------------------help--------------------"
echo "$0 子模块 [版本] [服务名] [API] "
echo "[例]添加新模块:$0 api "
echo "[例]api模块下添加接口:$0 api v1 user user "
exit 0
fi
# 初始化项目
if [${version} =='' ]
then
if [ ! -d ./${subName} ]; then
# 克隆项目 到本地
git clone -b master git@github.com:CiaraLi/subdemo.git ${subName}
# 替换默认module名
renameSpace ${subName} v1 test Test ./${subName}
# 提交Git分支
addGitConfig ${subName} ${subName}
fi
exit 0
else
if [${serName} =='' ]
then
echo "--------------------help--------------------"
echo "$0 子模块 [版本] [服务名] [API] "
echo "[例]添加新模块:$0 api "
echo "[例]api模块下添加接口:$0 api v1 user user "
exit 0
fi
#添加controller
newService ${subName} ${version} ${serName} ${apiName}
exit 0
fi
测试一下
$ ./gitAddSub.sh api
INFO: Git仓库已创建
- 在api新增一个admin服务,并创建user控制器
$ ./gitAddSub.sh api v1 admin user
INFO: 添加新接口 v1/admin/user
Cloning into 'tmp_sub_demo'...
Resolving deltas: 100% (21/21), done.
INFO: 添加控制器 api/v1/admin/UserController
INFO: 子模块已经添加至 ./v1/Module.php
INFO: 添加控制器 done
INFO: 添加模型 api/v1/admin/UserSearch等文件
INFO: 添加模型 done
INFO: 添加新接口 done ,访问路由 : v1/admin/user/list 测试接口
|