| | <?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; |
| | } |
| |
|
| | } |
| |
|