自制简单的脚手架-shell版(二)

前言

上次只做了初始化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% : 接口控制器名称
  • 2、在替换命名空间时,解析模板语法。
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} "
}
  • 7、复制目标服务、模型等文件,并解析模板语法
# 创建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

测试一下

  • 新增一个api模块
$ ./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 测试接口 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值