236 lines
8.0 KiB
PHP
236 lines
8.0 KiB
PHP
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
|
// +----------------------------------------------------------------------
|
|
// | Copyright (c) 2006~2018 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 public
|
|
* @param array $build build 列表
|
|
* @param string $namespace 应用类库命名空间
|
|
* @param bool $suffix 类库后缀
|
|
* @return void
|
|
* @throws Exception
|
|
*/
|
|
public static function run(array $build = [], $namespace = 'app', $suffix = false)
|
|
{
|
|
// 锁定
|
|
$lock = APP_PATH . 'build.lock';
|
|
|
|
// 如果锁定文件不可写(不存在)则进行处理,否则表示已经有程序在处理了
|
|
if (!is_writable($lock)) {
|
|
if (!touch($lock)) {
|
|
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($lock);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 创建目录
|
|
* @access protected
|
|
* @param array $list 目录列表
|
|
* @return void
|
|
*/
|
|
protected static function buildDir($list)
|
|
{
|
|
foreach ($list as $dir) {
|
|
// 目录不存在则创建目录
|
|
!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 ?: '';
|
|
|
|
// 创建模块目录
|
|
!is_dir(APP_PATH . $module) && mkdir(APP_PATH . $module);
|
|
|
|
// 如果不是 runtime 目录则需要创建配置文件和公共文件、创建模块的默认页面
|
|
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) {
|
|
self::checkDirBuild($modulePath . $dir);
|
|
}
|
|
} 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';
|
|
self::checkDirBuild(dirname($filename));
|
|
$content = '';
|
|
break;
|
|
default:
|
|
// 其他文件
|
|
$content = "<?php\nnamespace {$space};\n\nclass {$class}\n{\n\n}";
|
|
}
|
|
|
|
if (!is_file($filename)) {
|
|
file_put_contents($filename, $content);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 创建模块的欢迎页面
|
|
* @access protected
|
|
* @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)) {
|
|
$module = $module ? $module . '\\' : '';
|
|
$suffix = $suffix ? 'Controller' : '';
|
|
$content = str_replace(
|
|
['{$app}', '{$module}', '{layer}', '{$suffix}'],
|
|
[$namespace, $module, 'controller', $suffix],
|
|
file_get_contents(THINK_PATH . 'tpl' . DS . 'default_index.tpl')
|
|
);
|
|
|
|
self::checkDirBuild(dirname($filename));
|
|
file_put_contents($filename, $content);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 创建模块的公共文件
|
|
* @access protected
|
|
* @param string $module 模块名
|
|
* @return void
|
|
*/
|
|
protected static function buildCommon($module)
|
|
{
|
|
$config = CONF_PATH . ($module ? $module . DS : '') . 'config.php';
|
|
|
|
self::checkDirBuild(dirname($config));
|
|
|
|
if (!is_file($config)) {
|
|
file_put_contents($config, "<?php\n//配置文件\nreturn [\n\n];");
|
|
}
|
|
|
|
$common = APP_PATH . ($module ? $module . DS : '') . 'common.php';
|
|
if (!is_file($common)) file_put_contents($common, "<?php\n");
|
|
}
|
|
|
|
/**
|
|
* 创建目录
|
|
* @access protected
|
|
* @param string $dirname 目录名称
|
|
* @return void
|
|
*/
|
|
protected static function checkDirBuild($dirname)
|
|
{
|
|
!is_dir($dirname) && mkdir($dirname, 0755, true);
|
|
}
|
|
}
|