程序员是诗人,应该写一些有思想意义的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. Java导出页面数据或数据库数据至Excel文件并下载,采用JXL技术,小demo(servlet实现)

    public class ExportExcelServlet extends HttpServlet { /** * */ private static final long serialVersi ...

  2. 非常多人不愿意承认汉澳sinox已经超过windows

    汉澳sinox採用的zfs和jail打造高可靠性存储server和矩阵计算机,这不是windows和linux能相提并论的. 只是非常多人立即出来出来反驳说,windows驱动程序多(就是支持硬件多) ...

  3. UiAutomator源码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源码分析之启动和运行>我们描述了uitautomator从命令行运行到加载测试用例运行测试的整个流程,过程中我们也描述了UiAutomatorBridge ...

  4. Web应用程序整体测试基础——单元测试

    近年来,随着基于B/S结构的大型应用越来越多,Web应用程序测试问题也在逐步完善中.但Web应用程序测试既可以在系统开发中实施,也可以独立于系统单独完成,这取决于Web应用程序的复杂性和多样性.同时程 ...

  5. Erlang运行中的错误

    Erlang运行时发生错误时,会返回一些错误信息,理解这些信息,对于学好.用好Erlang来说是必要. Erlang中的运行错误包括:badarg, badarith, badmatch, funct ...

  6. Sql开发技巧

    原文:Sql开发技巧 简介 本文主要介绍下述几个技巧: 使用Row_Number分页 事务 根据条件刷选记录的技巧 分页 主要是使用了Row_Number()这个函数.一般如下: declare @P ...

  7. oracle中sql语句的优化

    oracle中sql语句的优化 一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边表或视图: Student_info   (30000条数据)D ...

  8. mediawiki在windows下的安装

    mediawiki在windows下的安装 对于刚接触wiki的朋友们来说,配置一个服务器环境,安装并运行mediawiki是一件很麻烦的事情,在这里,我尽量用通俗易懂的语言,介绍mw(mediawi ...

  9. 12个很少被人知道的CSS事实

    之前没有认真的研究过,padding-bottom的值如果是百分比,那么它的实际值是根据父类的宽度来调整的.我还以为是根据这个元素的本身的宽度来定义呢?汗..padding-top/padding-l ...

  10. HTML页面规范分解

    百度,淘宝,腾讯三大巨头HTML页面规范分解   [兼容html5方案] 百度贴吧,百度图片的实现 <!--[if lt IE 9]> <script> (function() ...