| <?php |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| 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('<error>' . $this->type . ' already exists!</error>'); |
| return false; |
| } |
|
|
| if (!is_dir(dirname($pathname))) { |
| mkdir(strtolower(dirname($pathname)), 0755, true); |
| } |
|
|
| file_put_contents($pathname, $this->buildClass($classname)); |
|
|
| $output->writeln('<info>' . $this->type . ' created successfully.</info>'); |
|
|
| } |
|
|
| 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; |
| } |
|
|
| } |
|
|