您的位置:首页 > 编程语言 > PHP开发

[李景山php]每天TP5-20161220|thinkphp5-build.php

2016-11-11 08:42 309 查看
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

namespace think;

class Build
{// 建造大师,
/**
* 根据传入的build资料创建目录和文件
* @access protected
* @param  array  $build build列表
* @param  string $namespace 应用类库命名空间
* @param  bool   $suffix 类库后缀
* @return void
*/
public static function run(array $build = [], $namespace = 'app', $suffix = false)
{// 就是创建 文件,或者是目录
// 锁定
$lockfile = APP_PATH . 'build.lock';// 创建一个锁定文件
if (is_writable($lockfile)) {// 如果文件可以写入 返回 也就是这个文件是否存在,存在就代表 已经创建完成
// 同时这个文件 代表写入锁定,我在,你就不能写入
return;
} elseif (!touch($lockfile)) {// 如果不可以创建,抛出异常
throw new Exception('应用目录[' . APP_PATH . ']不可写,目录无法自动生成!<BR>请手动生成项目目录~', 10006);
}
foreach ($build as $module => $list) {
if ('__dir__' == $module) {// 目录
// 创建目录列表
self::buildDir($list);
} elseif ('__file__' == $module) {// 文件
// 创建文件列表
self::buildFile($list);
} else {
// 创建模块
self::module($module, $list, $namespace, $suffix);
}
}
// 解除锁定
unlink($lockfile);// 删除 锁定文件,
}

/**
* 创建目录
* @access protected
* @param  array $list 目录列表
* @return void
*/
protected static function buildDir($list)
{
foreach ($list as $dir) {
if (!is_dir(APP_PATH . $dir)) {
// 创建目录
mkdir(APP_PATH . $dir, 0755, true);// 创建文件 权限不高,多级目录,可以
}
}
}

/**
* 创建文件
* @access protected
* @param  array $list 文件列表
* @return void
*/
protected static function buildFile($list)
{
foreach ($list as $file) {
if (!is_dir(APP_PATH . dirname($file))) {
// 创建目录
mkdir(APP_PATH . dirname($file), 0755, true);// 首先创建目录
}
if (!is_file(APP_PATH . $file)) {
file_put_contents(APP_PATH . $file, 'php' == pathinfo($file, PATHINFO_EXTENSION) ? "<?php\n" : '');
}// 创建基础文件
}
}

/**
* 创建模块
* @access public
* @param  string $module 模块名
* @param  array  $list build列表
* @param  string $namespace 应用类库命名空间
* @param  bool   $suffix 类库后缀
* @return void
*/
public static function module($module = '', $list = [], $namespace = 'app', $suffix = false)
{// 创建模块 很牛叉
// 模块名 列表 命名空间,类库后缀
$module = $module ? $module : '';// 默认 模块设置
if (!is_dir(APP_PATH . $module)) {// 保证目录存在
// 创建模块目录
mkdir(APP_PATH . $module);
}
if (basename(RUNTIME_PATH) != $module) {// 创造默认文件
// 创建配置文件和公共文件
self::buildCommon($module);// 配置及公共文件
// 创建模块的默认页面
self::buildHello($module, $namespace, $suffix);// 测试页面
}
if (empty($list)) {
// 创建默认的模块目录和文件
$list = [
'__file__' => ['config.php', 'common.php'],
'__dir__'  => ['controller', 'model', 'view'],
];
}// 默认创建的内容
// 创建子目录和文件
foreach ($list as $path => $file) {
$modulePath = APP_PATH . $module . DS;// 获取路径
if ('__dir__' == $path) {
// 生成子目录
foreach ($file as $dir) {
if (!is_dir($modulePath . $dir)) {
// 创建目录
mkdir($modulePath . $dir, 0755, true);
}
}
} elseif ('__file__' == $path) {
// 生成(空白)文件
foreach ($file as $name) {
if (!is_file($modulePath . $name)) {
file_put_contents($modulePath . $name, 'php' == pathinfo($name, PATHINFO_EXTENSION) ? "<?php\n" : '');
}
}
} else {
// 生成相关MVC文件
foreach ($file as $val) {
$val      = trim($val);
$filename = $modulePath . $path . DS . $val . ($suffix ? ucfirst($path) : '') . EXT;
$space    = $namespace . '\\' . ($module ? $module . '\\' : '') . $path;
$class    = $val . ($suffix ? ucfirst($path) : '');
switch ($path) {
case 'controller': // 控制器
$content = "<?php\nnamespace {$space};\n\nclass {$class}\n{\n\n}";
break;
case 'model': // 模型
$content = "<?php\nnamespace {$space};\n\nuse think\Model;\n\nclass {$class} extends Model\n{\n\n}";
break;
case 'view': // 视图
$filename = $modulePath . $path . DS . $val . '.html';
if (!is_dir(dirname($filename))) {
// 创建目录
mkdir(dirname($filename), 0755, true);
}
$content = '';
break;
default:
// 其他文件
$content = "<?php\nnamespace {$space};\n\nclass {$class}\n{\n\n}";
}

if (!is_file($filename)) {
file_put_contents($filename, $content);
}
}// 牛叉
}
}
}

/**
* 创建模块的欢迎页面
* @access public
* @param  string $module 模块名
* @param  string $namespace 应用类库命名空间
* @param  bool   $suffix 类库后缀
* @return void
*/
protected static function buildHello($module, $namespace, $suffix = false)
{// 从模版 创建 默认页面
$filename = APP_PATH . ($module ? $module . DS : '') . 'controller' . DS . 'Index' . ($suffix ? 'Controller' : '') . EXT;
if (!is_file($filename)) {
$content = file_get_contents(THINK_PATH . 'tpl' . DS . 'default_index.tpl');
$content = str_replace(['{$app}', '{$module}', '{layer}', '{$suffix}'], [$namespace, $module ? $module . '\\' : '', 'controller', $suffix ? 'Controller' : ''], $content);
if (!is_dir(dirname($filename))) {
mkdir(dirname($filename), 0755, true);
}
file_put_contents($filename, $content);
}
}

/**
* 创建模块的公共文件
* @access public
* @param  string $module 模块名
* @return void
*/
protected static function buildCommon($module)
{
$filename = CONF_PATH . ($module ? $module . DS : '') . 'config.php';
if (!is_file($filename)) {
file_put_contents($filename, "<?php\n//配置文件\nreturn [\n\n];");
}// 创建配置文件
$filename = APP_PATH . ($module ? $module . DS : '') . 'common.php';
if (!is_file($filename)) {
file_put_contents($filename, "<?php\n");
}// 创建 通过文件
}
}
/**
* 总结:
* 就是创建各种文件跟目录,
* 目录容易,文件困难,尤其是模块文件,
* 需要根据不同的选项 MVC 创建不同类型的文件
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  thinkphp