// +---------------------------------------------------------------------- namespace think\console\command; use think\App; use think\Config; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\Output; abstract class Make extends Command { protected $type; abstract protected function getStub(); protected function configure() { $this->addArgument('name', Argument::REQUIRED, "The name of the class"); } protected function execute(Input $input, Output $output) { $name = trim($input->getArgument('name')); $classname = $this->getClassName($name); $pathname = $this->getPathName($classname); if (is_file($pathname)) { $output->writeln('' . $this->type . ' already exists!'); return false; } if (!is_dir(dirname($pathname))) { mkdir(strtolower(dirname($pathname)), 0755, true); } file_put_contents($pathname, $this->buildClass($classname)); $output->writeln('' . $this->type . ' created successfully.'); } protected function buildClass($name) { $stub = file_get_contents($this->getStub()); $namespace = trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\'); $class = str_replace($namespace . '\\', '', $name); return str_replace(['{%className%}', '{%namespace%}', '{%app_namespace%}'], [ $class, $namespace, App::$namespace, ], $stub); } protected function getPathName($name) { $name = str_replace(App::$namespace . '\\', '', $name); return APP_PATH . str_replace('\\', '/', $name) . '.php'; } protected function getClassName($name) { $appNamespace = App::$namespace; if (strpos($name, $appNamespace . '\\') === 0) { return $name; } if (Config::get('app_multi_module')) { if (strpos($name, '/')) { list($module, $name) = explode('/', $name, 2); } else { $module = 'common'; } } else { $module = null; } if (strpos($name, '/') !== false) { $name = str_replace('/', '\\', $name); } return $this->getNamespace($appNamespace, $module) . '\\' . $name; } protected function getNamespace($appNamespace, $module) { return $module ? ($appNamespace . '\\' . $module) : $appNamespace; } }