diff --git a/src/ZM/Command/Command.php b/src/ZM/Command/Command.php index 17a1eabb..9ded2f91 100644 --- a/src/ZM/Command/Command.php +++ b/src/ZM/Command/Command.php @@ -6,15 +6,28 @@ namespace ZM\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\Console\Output\ConsoleSectionOutput; use Symfony\Component\Console\Output\OutputInterface; use ZM\Exception\ZMException; abstract class Command extends \Symfony\Component\Console\Command\Command { + /** + * 输入 + */ protected InputInterface $input; + /** + * 输出 + * + * 一般来说同样会是 ConsoleOutputInterface + */ protected OutputInterface $output; + /** + * {@inheritdoc} + * @internal 不建议覆写此方法,建议使用 {@see handle()} 方法 + */ protected function execute(InputInterface $input, OutputInterface $output): int { $this->input = $input; @@ -22,38 +35,88 @@ abstract class Command extends \Symfony\Component\Console\Command\Command return $this->handle(); } + /** + * 命令的主体 + * + * @return int 命令执行结果 {@see self::SUCCESS} 或 {@see self::FAILURE} 或 {@see self::INVALID} + */ abstract protected function handle(): int; + /** + * 输出一段文本,默认样式 + * + * @param string $message 要输出的文本 + * @param bool $newline 是否在文本后换行 + * @see OutputInterface::write() + */ protected function write(string $message, bool $newline = true): void { $this->output->write($message, $newline); } + /** + * 输出文本,一般用于提示信息 + * + * @param string $message 要输出的文本 + * @param bool $newline 是否在文本后换行 + */ protected function info(string $message, bool $newline = true): void { $this->write("{$message}", $newline); } + /** + * 输出文本,一般用于错误信息 + * + * @param string $message 要输出的文本 + * @param bool $newline 是否在文本后换行 + */ protected function error(string $message, bool $newline = true): void { $this->write("{$message}", $newline); } + /** + * 输出文本,一般用于警告或附注信息 + * + * @param string $message 要输出的文本 + * @param bool $newline 是否在文本后换行 + */ protected function comment(string $message, bool $newline = true): void { $this->write("{$message}", $newline); } + /** + * 输出文本,一般用于提问信息 + * + * @param string $message 要输出的文本 + * @param bool $newline 是否在文本后换行 + */ protected function question(string $message, bool $newline = true): void { $this->write("{$message}", $newline); } + /** + * 输出文本,一般用于详细信息 + * + * @param string $message 要输出的文本 + * @param bool $newline 是否在文本后换行 + */ protected function detail(string $message, bool $newline = true): void { $this->write("{$message}", $newline); } + /** + * 输出一个区块,区块内内容可以覆写 + * + * 此功能需要 $output 为 {@see ConsoleOutputInterface} 类型 + * + * @param string $message 作为标题的文本 + * @param callable $callback 回调函数,接收一个参数,类型为 {@see ConsoleSectionOutput} + */ protected function section(string $message, callable $callback): void { $output = $this->output; @@ -67,7 +130,7 @@ abstract class Command extends \Symfony\Component\Console\Command\Command $callback($section); } catch (ZMException $e) { $this->error($e->getMessage()); - exit(1); + exit(self::FAILURE); } } } diff --git a/src/ZM/Command/InitCommand.php b/src/ZM/Command/InitCommand.php index e4ac59ab..e841eea4 100644 --- a/src/ZM/Command/InitCommand.php +++ b/src/ZM/Command/InitCommand.php @@ -108,7 +108,7 @@ class InitCommand extends Command // 将命令行入口标记为可执行 chmod($this->base_path . '/zhamao', 0755); - return 0; + return self::SUCCESS; } private function getExtractFiles(): array