程序员是诗人,应该写一些有思想意义的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. MVC页面声命周期

    MVC页面声命周期 ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期   开篇:上一篇我们了解了所谓的请求处理管道,在众多的事件中微软开放了19个重要的事件给我们, ...

  2. Oracle并行查询出错

    1.错误描写叙述 ORA-12801: 并行查询服务器P007中发出错误信号 ORA-01722:无效数字 12801.00000 -"error signaled in parallel ...

  3. JQuery slideToggle 演示简单的 Slide Panel 效果。

    ------------------html--------------------------------- <html xmlns="http://www.w3.org/1999/ ...

  4. SUI Mobile框架开发,android、ios表单遇到的问题

    1.页面添加区域滚动,滚动区域内元素事件无效问题 解决方法: <script type="text/javascript" charset="utf-8" ...

  5. C# & WPF 随手小记之一 ——初探async await 实现多线程处理

    嗯...我也是在园子待了不短时间的人了,一直以来汲取着园友的知识,感觉需要回馈什么. 于是以后有空我都会把一些小技巧小知识写下来,有时候可能会很短甚至很简单,但希望能帮到大家咯. 第一篇文章来说说as ...

  6. PHP专业开发IDE——Zend Studio 10.5预览版发布

    Zend Studio是新一代的PHP IDE,高效的开发和维护PHP代码是它的核心.Zend公司目前已发布了Zend Studio 10.5预览版,预览版中提高了快速响应能力和时时误差检查.因此使用 ...

  7. .NET的微型Web框架 Nancy

    .NET的微型Web框架 Nancy .NET的微型Web框架 Nancy   大部分微软平台的开发人员如果选择开发框架只能是在ASP.NET WEBFORM和ASP.NET MVC两个之间选择. 而 ...

  8. SQL SERVER统计服务器所有的数据库(数据库文件)、表(表行数)、字段(各字段)等详细信息

    原文:SQL SERVER统计服务器所有的数据库(数据库文件).表(表行数).字段(各字段)等详细信息 USE STAT GO SET NOCOUNT ON IF EXISTS(SELECT 1 FR ...

  9. 在希望的田野上--生物柴油(Biodiesel)光明的未来

    请看下图: 这是科学家Bernie Tao教授给美国Purdue大学的学生们出的题目"有关大豆.谷物产品的创新竞赛",实质上,就是鼓舞研究.开发及应用生物柴油(Biodiesel) ...

  10. 【转】android动画之Tween动画 (渐变、缩放、位移、旋转)

    原文:http://blog.csdn.net/feng88724/article/details/6318430 Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的 ...