简化日常工作之三:自己写一个CI脚手架
程序员是诗人,应该写一些有思想意义的code,而不是每天重复造轮子,写一些低成本的业务逻辑。
---------------------------------一个脚本仔的心声
由于目前公司使用CI框架,也遇到过需要大量新建controller,model等的新需求情况,我就在想是否能把一些公用的代码通过批量初始化成文件,减少不必要的重复书写。趁着阶段性上线间隙,我开始写这个基于命令脚本方式的自动化脚手架。基于CI,但是思想是适合任何不带官方脚手架功能的项目。(例如yii有官方的gii,cakephp也有cake命令)
首先,我要批量生成的文件类型分为三种:controller,model,helper.
其中controller类文件,除了自动加载同名model外,还自带curd的操作函数定义。而model则预先写进findById函数和具体实现。关于模板的导入,我本来想单独写一个文件来装,然后通过一些字符串替换达到变量赋值,后来觉得有点麻烦,改用heredoc来进行字符串拼接成完整自定义模板。该脚手架项目目录结构如下:
controllers,helpers,models文件夹分别存放对应生成的文件。
其中creater.php内容如下:
<?php /**
* 自动化生成代码框架的工具类
**/ require './config/template.php'; class Creater
{ protected $controllers = array(); // 控制器数组 protected $template = null; protected $models = array(); // 模型数组 protected $helpers = array(); // 组件数组 protected $configs = array(); public function __construct()
{
require './config/conf.php'; // 加载配置
$this->configs = $config;
}
/**
* 根据名称和模块生成默认模板内容的控制器
*
* @param string $controllerStrs
* @return string
*/
public function controller($controllerStrs)
{
$this->_createFile('controller', $controllerStrs);
} /**
* 根据名称和模块生成默认模板内容的model
*
* @param string $modelStrs
* @return string
*/
public function model($modelStrs)
{
$this->_createFile('model', $modelStrs);
} /**
* 根据名称和模块生成默认模板内容的helper
*
* @param string $helperStrs
* @return string
*/
public function helper($helperStrs)
{
$this->_createFile('helper', $helperStrs);
} /**
* 将缩写命令补全为完整命令并执行
*
* @param array $params
* @return string
*/
public function alia(array $params)
{
$operation = '';
switch ($params['opt']) {
case 'c':
$operation = 'controller';
break;
case 'm':
$operation = 'model';
break;
case 'h':
$operation = 'helper';
break; default:
exit('error operation !');
break;
} $this->$operation($params['contents']);
} /**
* 创建文件
*
* @param string $typeName 文件类型
* @param string $string 文件名字符串,多个以逗号分隔
* @author freephp
*/
private function _createFile($typeName, $string){
$typeField = $typeName . 's';
$this->$typeField = explode(',', $string);
if (empty($this->$typeField)) exit("no $typeName's name enter, please check your input!");
$template = new Template(array('type' => $typeName, 'isNormal' => true)); foreach ($this->$typeField as $k => $v) { $template->className = $v; if (strstr($v, '/')) {
$this->__splitDirsAndFile();
} $contents = $template->loadFile(); $filePath = $this->configs[$typeName . 'Path'] . '/' . strtolower($v) . $this->_getFileTail($typeName); if(!file_exists($filePath)) {
$this->_writeFile($filePath, $contents);
echo 'success write it!' , "\r\n";
} else {
$this->_writeFile($filePath, $contents);
print_r('The ' . $typeName . ' ' . $v . ' has existed, created again!');
}
}
} /**
* 写入文件
*
* @param string $filePath 文件地址
* @param string $contents 文件内容
* @author freephp
*/
private function _writeFile($filePath, $contents)
{
$fp = fopen($filePath, 'w');
fputs($fp, $contents);
fclose($fp); } /**
* 获取文件后缀
*
* @param string $typeName 文件类型
* @return string
*/
private function _getFileTail($typeName) {
$tail = '.php';
if ($typeName == 'model') $tail = '_model.php';
if ($typeName == 'helper') $tail = '_helper.php'; return $tail;
} private function __splitDirsAndFile() {
$path = substr($v, 0, strripos(strtolower($v), '/')); $toCreatePath = $this->configs[$typeName . 'Path'] . '/' . $path;
if (!is_dir($toCreatePath)) {
mkdir($toCreatePath, 0777, true);
} $template->className = str_replace($path .'/', '', $v);
}
} /*
采用脚本方式 生成controller文件
php creater.php controller game,news,product or php creater.php c game.product or php creater.php controller game2015/game,news,product
*/
if (count($argv) < 1) {
return;
} $action = trim($argv[1]);
$param = trim($argv[2]); $creater = new Creater(); if (strlen($action) == 1) {
$creater->alia(['opt' => $action, 'contents' => $param]);
} else {
$creater->$action($params);
}
不仅可以以逗号分隔方式批量生成代码文件,还可以以/分隔目录和文件,连带目录结构去生成。比如:
php creater.php controller game/gameClick,ad/adClick,hots/hotClick
那么会创建出controllers/game/gameClick.php,
controllers/ad/adClick.php,
controllers/hots/hotClick.php
其中由代码可见,为了方便命令行输入,有alia函数去把缩写命令给补全,如:
php creater.php c game # => php creater.php controller game
最后贴出我这个脚手架小工具的github地址:https://github.com/freephp2015/autoCreater (已有bug修复,新增--help功能)
欢迎沟通交流。代码要越写越少,做一个lazy man吧。
{S{MGH%GOC.png)
简化日常工作之三:自己写一个CI脚手架的更多相关文章
- 从零开始写一个前端脚手架四、初始化进程提示(chalk)
我们之前说过bin里面的index.js文件是作为入口文件存在的.实际上的初始化内容在.action里面操作的,为了方便管理,我们把实际操作的代码抽出来放一块儿管理 创建指令文件 在根目录创建一个co ...
- Watir 简化日常工作实例
公司的官方主页要优化搜索任务,一共有110个独立页面,开发工程师做了以下工作:1. 为所有这些页面的每个图片添加了alt:2. 为页面上的每个标题添加了面包屑:3. 为网站最重要的标题设置H1标签,而 ...
- awbeci—一个帮助你快速处理日常工作的网址收集网站
大家好,我是awbeci作者,awbeci网站是一个能够快速处理日常工作的网址收集网站,为什么这样说呢?下面我将为大家介绍这个网站的由来,以及设计它的初衷和如何使用以及对未来的展望和计划,以及bug反 ...
- JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力。。
JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力.. 小森执行一 ...
- 简化ETL工作,编写一个Canal胶水层
前提 这是一篇憋了很久的文章,一直想写,却又一直忘记了写.整篇文章可能会有点流水账,相对详细地介绍怎么写一个小型的"框架".这个精悍的胶水层已经在生产环境服役超过半年,这里尝试把耦 ...
- 手把手教你手写一个最简单的 Spring Boot Starter
欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...
- 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)
从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...
- IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题
程序员的工作不是写程序,而是写程序解决问题. --- 某不知名程序员 我们每天都在写代码,有些代码有结构性的相似,但不是所有的代码都可以被抽成方法.在这种情况下,我们应该考虑使用template的方式 ...
- 操刀 requirejs,自己动手写一个
前沿 写在文章的最前面 这篇文章讲的是,我怎么去写一个 requirejs . 去 github 上fork一下,顺便star~ requirejs,众所周知,是一个非常出名的js模块化工具,可以让你 ...
随机推荐
- dom03
鼠标事件: 键盘事件: //通过class获取元素,封装一个通过class获取元素的方法 //IE10以下不支持document.getElementByClass() function getByC ...
- POJ 1028 Web Navigation 题解
考查代码能力的题目.也能够说是算法水题,呵呵. 推荐新手练习代码能力. 要添加难度就使用纯C实现一下stack,那么就有点难度了,能够使用数组模拟环形栈.做多了,我就直接使用STL了. #includ ...
- Spring IOC 之Bean作用域
当你创建一个bean定义的时候,你创建了一份通过那种bean定义的bean的创建类的真正实力的处方.bean的定义是一个处方 的想法是很重要的的.因为这意味着,对于一个类你可以创建很多对象实例从一个单 ...
- 【MS SQL】查看任务执行进度
原文:[MS SQL]查看任务执行进度 备份或还原数据库时,我一般是用MS SQL工具向导来进行,由于工具向导没有显示任务执行过程的状态, 如果数据库比较大执行时间较长的话,对任务啥时候执行完成比较迷 ...
- 什么是Solr搜索
什么是Solr搜索 一.Solr综述 什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...
- go orcale
golang连接orcale 使用glang有一段时间了,最开始其实并不太喜欢他的语法,但是后来熟悉之后发现用起来还挺爽的.之前数据库一直使用mysql,连接起来没有什么问题,github上有很多 ...
- 使用POI 导入excel
引言:最近一直在接触excel的问题,网页也有很多关于POI解析excel的资料,我也简单的整理了下,有不对地方的还望及时指正,渴望与大家交流并学习. public int importExcel(F ...
- Web Api中实现Http方法(Put,Post,Delete)
在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我 ...
- REST风格的服务
使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[三]——Web Api入门 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.htm ...
- js模版引擎handlebars.js实用教程
js模版引擎handlebars.js实用教程 阅读本文需要了解基本的Handlebars.js概念,本文并不是Handlebars.js基础教程,而是注重于实际应用,为读者阐述使用过程中可能会遇到的 ...