程序员是诗人,应该写一些有思想意义的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吧。

简化日常工作之三:自己写一个CI脚手架的更多相关文章

  1. 从零开始写一个前端脚手架四、初始化进程提示(chalk)

    我们之前说过bin里面的index.js文件是作为入口文件存在的.实际上的初始化内容在.action里面操作的,为了方便管理,我们把实际操作的代码抽出来放一块儿管理 创建指令文件 在根目录创建一个co ...

  2. Watir 简化日常工作实例

    公司的官方主页要优化搜索任务,一共有110个独立页面,开发工程师做了以下工作:1. 为所有这些页面的每个图片添加了alt:2. 为页面上的每个标题添加了面包屑:3. 为网站最重要的标题设置H1标签,而 ...

  3. awbeci—一个帮助你快速处理日常工作的网址收集网站

    大家好,我是awbeci作者,awbeci网站是一个能够快速处理日常工作的网址收集网站,为什么这样说呢?下面我将为大家介绍这个网站的由来,以及设计它的初衷和如何使用以及对未来的展望和计划,以及bug反 ...

  4. JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力。。

      JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力..   小森执行一 ...

  5. 简化ETL工作,编写一个Canal胶水层

    前提 这是一篇憋了很久的文章,一直想写,却又一直忘记了写.整篇文章可能会有点流水账,相对详细地介绍怎么写一个小型的"框架".这个精悍的胶水层已经在生产环境服役超过半年,这里尝试把耦 ...

  6. 手把手教你手写一个最简单的 Spring Boot Starter

    欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...

  7. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)

    从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...

  8. IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题

    程序员的工作不是写程序,而是写程序解决问题. --- 某不知名程序员 我们每天都在写代码,有些代码有结构性的相似,但不是所有的代码都可以被抽成方法.在这种情况下,我们应该考虑使用template的方式 ...

  9. 操刀 requirejs,自己动手写一个

    前沿 写在文章的最前面 这篇文章讲的是,我怎么去写一个 requirejs . 去 github 上fork一下,顺便star~ requirejs,众所周知,是一个非常出名的js模块化工具,可以让你 ...

随机推荐

  1. Linux忘记rootpassword

    我们常常会碰到忘记rootpassword的情况,以下是解决之道,  此方法使用绝大多数的Linux发行版:  1. 首先进入grub  2. 在须要编辑的入口处,按下e,在quite后增加     ...

  2. IIS服务器 远程发布(Web Deploy)配置 VS2010 开发环境 Windows Server 2008服务器系统

    原文:IIS服务器 远程发布(Web Deploy)配置 VS2010 开发环境 Windows Server 2008服务器系统 asp.net 网站有三种常用的发布方式:分别是拷贝开发机上发布好的 ...

  3. hdu 4858 项目管理(STL集装箱)

    项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. C语言实现全排列

    实现全排列,递归实现 #include <stdio.h> #include <stdlib.h> ; void swap(int *a, int *b) { int m; m ...

  5. HTML5学习资源

    http://www.silverlightchina.net/html/HTML_5/study/ 我们一起学:HTML5标签系列教程(一)-video标签 版权声明:本文博客原创文章.博客,未经同 ...

  6. Unity3D第三人称摄像机控制脚本

    好久没有敲Blog该.感谢您的留言.注意.私人信件和其他支持,但我似乎没有办法继续自己曾经写了一篇博客系列,因为我在网上找到有关unity3D太少的内容,U3D相关的文章!.. 第三人称视角 第三人称 ...

  7. [QT Creator]LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 。

    这个问题很恶心!网上说的原因是因为安装了多了版本的VS.在高版本的2010和2012上都会有问题,解决方法是使用visual studio 2008安装目录下的一个文件替代vs2010安装目录下的文件 ...

  8. C++ const关键字用法详解

    1const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目. 事实上这个概念谁都有只是三种声明方式非常相似很容易记混. Bjarne在他的T ...

  9. C#自定义配置文件节点

    老实说,在以前没写个自定义配置节点之前,我都是写到一个很常用的节点里面,就是appSettings里add,然后再对各个节点的value值进行字符串分割操作,根据各种分割字符嵌套循环处理,后来看到一些 ...

  10. 关于Django模板引擎的研究

    原创博文,转载请注明出处. 以前曾遇到过错误Reverse for ‘*’ with arguments '()' and keyword arguments' not found.1其原因是没有给视 ...