Build.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. namespace think;
  12. class Build
  13. {
  14. /**
  15. * 根据传入的 build 资料创建目录和文件
  16. * @access public
  17. * @param array $build build 列表
  18. * @param string $namespace 应用类库命名空间
  19. * @param bool $suffix 类库后缀
  20. * @return void
  21. * @throws Exception
  22. */
  23. public static function run(array $build = [], $namespace = 'app', $suffix = false)
  24. {
  25. // 锁定
  26. $lock = APP_PATH . 'build.lock';
  27. // 如果锁定文件不可写(不存在)则进行处理,否则表示已经有程序在处理了
  28. if (!is_writable($lock)) {
  29. if (!touch($lock)) {
  30. throw new Exception(
  31. '应用目录[' . APP_PATH . ']不可写,目录无法自动生成!<BR>请手动生成项目目录~',
  32. 10006
  33. );
  34. }
  35. foreach ($build as $module => $list) {
  36. if ('__dir__' == $module) {
  37. // 创建目录列表
  38. self::buildDir($list);
  39. } elseif ('__file__' == $module) {
  40. // 创建文件列表
  41. self::buildFile($list);
  42. } else {
  43. // 创建模块
  44. self::module($module, $list, $namespace, $suffix);
  45. }
  46. }
  47. // 解除锁定
  48. unlink($lock);
  49. }
  50. }
  51. /**
  52. * 创建目录
  53. * @access protected
  54. * @param array $list 目录列表
  55. * @return void
  56. */
  57. protected static function buildDir($list)
  58. {
  59. foreach ($list as $dir) {
  60. // 目录不存在则创建目录
  61. !is_dir(APP_PATH . $dir) && mkdir(APP_PATH . $dir, 0755, true);
  62. }
  63. }
  64. /**
  65. * 创建文件
  66. * @access protected
  67. * @param array $list 文件列表
  68. * @return void
  69. */
  70. protected static function buildFile($list)
  71. {
  72. foreach ($list as $file) {
  73. // 先创建目录
  74. if (!is_dir(APP_PATH . dirname($file))) {
  75. mkdir(APP_PATH . dirname($file), 0755, true);
  76. }
  77. // 再创建文件
  78. if (!is_file(APP_PATH . $file)) {
  79. file_put_contents(
  80. APP_PATH . $file,
  81. 'php' == pathinfo($file, PATHINFO_EXTENSION) ? "<?php\n" : ''
  82. );
  83. }
  84. }
  85. }
  86. /**
  87. * 创建模块
  88. * @access public
  89. * @param string $module 模块名
  90. * @param array $list build 列表
  91. * @param string $namespace 应用类库命名空间
  92. * @param bool $suffix 类库后缀
  93. * @return void
  94. */
  95. public static function module($module = '', $list = [], $namespace = 'app', $suffix = false)
  96. {
  97. $module = $module ?: '';
  98. // 创建模块目录
  99. !is_dir(APP_PATH . $module) && mkdir(APP_PATH . $module);
  100. // 如果不是 runtime 目录则需要创建配置文件和公共文件、创建模块的默认页面
  101. if (basename(RUNTIME_PATH) != $module) {
  102. self::buildCommon($module);
  103. self::buildHello($module, $namespace, $suffix);
  104. }
  105. // 未指定文件和目录,则创建默认的模块目录和文件
  106. if (empty($list)) {
  107. $list = [
  108. '__file__' => ['config.php', 'common.php'],
  109. '__dir__' => ['controller', 'model', 'view'],
  110. ];
  111. }
  112. // 创建子目录和文件
  113. foreach ($list as $path => $file) {
  114. $modulePath = APP_PATH . $module . DS;
  115. if ('__dir__' == $path) {
  116. // 生成子目录
  117. foreach ($file as $dir) {
  118. self::checkDirBuild($modulePath . $dir);
  119. }
  120. } elseif ('__file__' == $path) {
  121. // 生成(空白)文件
  122. foreach ($file as $name) {
  123. if (!is_file($modulePath . $name)) {
  124. file_put_contents(
  125. $modulePath . $name,
  126. 'php' == pathinfo($name, PATHINFO_EXTENSION) ? "<?php\n" : ''
  127. );
  128. }
  129. }
  130. } else {
  131. // 生成相关 MVC 文件
  132. foreach ($file as $val) {
  133. $val = trim($val);
  134. $filename = $modulePath . $path . DS . $val . ($suffix ? ucfirst($path) : '') . EXT;
  135. $space = $namespace . '\\' . ($module ? $module . '\\' : '') . $path;
  136. $class = $val . ($suffix ? ucfirst($path) : '');
  137. switch ($path) {
  138. case 'controller': // 控制器
  139. $content = "<?php\nnamespace {$space};\n\nclass {$class}\n{\n\n}";
  140. break;
  141. case 'model': // 模型
  142. $content = "<?php\nnamespace {$space};\n\nuse think\Model;\n\nclass {$class} extends Model\n{\n\n}";
  143. break;
  144. case 'view': // 视图
  145. $filename = $modulePath . $path . DS . $val . '.html';
  146. self::checkDirBuild(dirname($filename));
  147. $content = '';
  148. break;
  149. default:
  150. // 其他文件
  151. $content = "<?php\nnamespace {$space};\n\nclass {$class}\n{\n\n}";
  152. }
  153. if (!is_file($filename)) {
  154. file_put_contents($filename, $content);
  155. }
  156. }
  157. }
  158. }
  159. }
  160. /**
  161. * 创建模块的欢迎页面
  162. * @access protected
  163. * @param string $module 模块名
  164. * @param string $namespace 应用类库命名空间
  165. * @param bool $suffix 类库后缀
  166. * @return void
  167. */
  168. protected static function buildHello($module, $namespace, $suffix = false)
  169. {
  170. $filename = APP_PATH . ($module ? $module . DS : '') .
  171. 'controller' . DS . 'Index' .
  172. ($suffix ? 'Controller' : '') . EXT;
  173. if (!is_file($filename)) {
  174. $module = $module ? $module . '\\' : '';
  175. $suffix = $suffix ? 'Controller' : '';
  176. $content = str_replace(
  177. ['{$app}', '{$module}', '{layer}', '{$suffix}'],
  178. [$namespace, $module, 'controller', $suffix],
  179. file_get_contents(THINK_PATH . 'tpl' . DS . 'default_index.tpl')
  180. );
  181. self::checkDirBuild(dirname($filename));
  182. file_put_contents($filename, $content);
  183. }
  184. }
  185. /**
  186. * 创建模块的公共文件
  187. * @access protected
  188. * @param string $module 模块名
  189. * @return void
  190. */
  191. protected static function buildCommon($module)
  192. {
  193. $config = CONF_PATH . ($module ? $module . DS : '') . 'config.php';
  194. self::checkDirBuild(dirname($config));
  195. if (!is_file($config)) {
  196. file_put_contents($config, "<?php\n//配置文件\nreturn [\n\n];");
  197. }
  198. $common = APP_PATH . ($module ? $module . DS : '') . 'common.php';
  199. if (!is_file($common)) file_put_contents($common, "<?php\n");
  200. }
  201. /**
  202. * 创建目录
  203. * @access protected
  204. * @param string $dirname 目录名称
  205. * @return void
  206. */
  207. protected static function checkDirBuild($dirname)
  208. {
  209. !is_dir($dirname) && mkdir($dirname, 0755, true);
  210. }
  211. }