Build.php 7.4 KB

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