IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 自制简单的脚手架-shell版(二) -> 正文阅读

[PHP知识库]自制简单的脚手架-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 测试接口 
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:04:22  更:2021-12-15 18:05:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:32:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码