| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- <?php
- // +----------------------------------------------------------------------
- // | ThinkPHP [ WE CAN DO IT JUST THINK ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- // +----------------------------------------------------------------------
- // | Author: yunwuxin <448901948@qq.com>
- // +----------------------------------------------------------------------
- namespace think\app\command;
- use think\console\Command;
- use think\console\Input;
- use think\console\input\Argument;
- use think\console\Output;
- class Build extends Command
- {
- /**
- * 应用基础目录
- * @var string
- */
- protected $basePath;
- /**
- * {@inheritdoc}
- */
- protected function configure()
- {
- $this->setName('build')
- ->addArgument('app', Argument::OPTIONAL, 'app name .')
- ->setDescription('Build App Dirs');
- }
- protected function execute(Input $input, Output $output)
- {
- $this->basePath = $this->app->getBasePath();
- $app = $input->getArgument('app') ?: '';
- if (is_file($this->basePath . 'build.php')) {
- $list = include $this->basePath . 'build.php';
- } else {
- $list = [
- '__dir__' => ['controller', 'model', 'view'],
- ];
- }
- $this->buildApp($app, $list);
- $output->writeln("<info>Successed</info>");
- }
- /**
- * 创建应用
- * @access protected
- * @param string $app 应用名
- * @param array $list 目录结构
- * @return void
- */
- protected function buildApp(string $app, array $list = []): void
- {
- if (!is_dir($this->basePath . $app)) {
- // 创建应用目录
- mkdir($this->basePath . $app);
- }
- $appPath = $this->basePath . ($app ? $app . DIRECTORY_SEPARATOR : '');
- $namespace = 'app' . ($app ? '\\' . $app : '');
- // 创建配置文件和公共文件
- $this->buildCommon($app);
- // 创建模块的默认页面
- $this->buildHello($app, $namespace);
- foreach ($list as $path => $file) {
- if ('__dir__' == $path) {
- // 生成子目录
- foreach ($file as $dir) {
- $this->checkDirBuild($appPath . $dir);
- }
- } elseif ('__file__' == $path) {
- // 生成(空白)文件
- foreach ($file as $name) {
- if (!is_file($appPath . $name)) {
- file_put_contents($appPath . $name, 'php' == pathinfo($name, PATHINFO_EXTENSION) ? '<?php' . PHP_EOL : '');
- }
- }
- } else {
- // 生成相关MVC文件
- foreach ($file as $val) {
- $val = trim($val);
- $filename = $appPath . $path . DIRECTORY_SEPARATOR . $val . '.php';
- $space = $namespace . '\\' . $path;
- $class = $val;
- switch ($path) {
- case 'controller': // 控制器
- if ($this->app->config->get('route.controller_suffix')) {
- $filename = $appPath . $path . DIRECTORY_SEPARATOR . $val . 'Controller.php';
- $class = $val . 'Controller';
- }
- $content = "<?php" . PHP_EOL . "namespace {$space};" . PHP_EOL . PHP_EOL . "class {$class}" . PHP_EOL . "{" . PHP_EOL . PHP_EOL . "}";
- break;
- case 'model': // 模型
- $content = "<?php" . PHP_EOL . "namespace {$space};" . PHP_EOL . PHP_EOL . "use think\Model;" . PHP_EOL . PHP_EOL . "class {$class} extends Model" . PHP_EOL . "{" . PHP_EOL . PHP_EOL . "}";
- break;
- case 'view': // 视图
- $filename = $appPath . $path . DIRECTORY_SEPARATOR . $val . '.html';
- $this->checkDirBuild(dirname($filename));
- $content = '';
- break;
- default:
- // 其他文件
- $content = "<?php" . PHP_EOL . "namespace {$space};" . PHP_EOL . PHP_EOL . "class {$class}" . PHP_EOL . "{" . PHP_EOL . PHP_EOL . "}";
- }
- if (!is_file($filename)) {
- file_put_contents($filename, $content);
- }
- }
- }
- }
- }
- /**
- * 创建应用的欢迎页面
- * @access protected
- * @param string $app 目录
- * @param string $namespace 类库命名空间
- * @return void
- */
- protected function buildHello(string $app, string $namespace): void
- {
- $suffix = $this->app->config->get('route.controller_suffix') ? 'Controller' : '';
- $filename = $this->basePath . ($app ? $app . DIRECTORY_SEPARATOR : '') . 'controller' . DIRECTORY_SEPARATOR . 'Index' . $suffix . '.php';
- if (!is_file($filename)) {
- $content = file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'stubs' . DIRECTORY_SEPARATOR . 'controller.stub');
- $content = str_replace(['{%name%}', '{%app%}', '{%layer%}', '{%suffix%}'], [$app, $namespace, 'controller', $suffix], $content);
- $this->checkDirBuild(dirname($filename));
- file_put_contents($filename, $content);
- }
- }
- /**
- * 创建应用的公共文件
- * @access protected
- * @param string $app 目录
- * @return void
- */
- protected function buildCommon(string $app): void
- {
- $appPath = $this->basePath . ($app ? $app . DIRECTORY_SEPARATOR : '');
- if (!is_file($appPath . 'common.php')) {
- file_put_contents($appPath . 'common.php', "<?php" . PHP_EOL . "// 这是系统自动生成的公共文件" . PHP_EOL);
- }
- foreach (['event', 'middleware', 'common'] as $name) {
- if (!is_file($appPath . $name . '.php')) {
- file_put_contents($appPath . $name . '.php', "<?php" . PHP_EOL . "// 这是系统自动生成的{$name}定义文件" . PHP_EOL . "return [" . PHP_EOL . PHP_EOL . "];" . PHP_EOL);
- }
- }
- }
- /**
- * 创建目录
- * @access protected
- * @param string $dirname 目录名称
- * @return void
- */
- protected function checkDirBuild(string $dirname): void
- {
- if (!is_dir($dirname)) {
- mkdir($dirname, 0755, true);
- }
- }
- }
|