# 命令行 Hyperf 的命令行默认由 [hyperf/command](https://github.com/hyperf/command) 组件提供,而该组件本身也是基于 [symfony/console](https://github.com/symfony/console) 的抽象。 # 安装 通常来说该组件会默认存在,但如果您希望用于非 Hyperf 项目,也可通过下面的命令依赖 [hyperf/command](https://github.com/hyperf/command) 组件: ```bash composer require hyperf/command ``` # 查看命令列表 直接运行 `php bin/hyperf.php` 不带任何的参数即为输出命令列表。 # 自定义命令 ## 生成命令 如果你有安装 [hyperf/devtool](https://github.com/hyperf/devtool) 组件的话,可以通过 `gen:command` 命令来生成一个自定义命令: ```bash php bin/hyperf.php gen:command FooCommand ``` 执行上述命令后,便会在 `app/Command` 文件夹内生成一个配置好的 `FooCommand` 类了。 ### 定义命令 定义该命令类所对应的命令有两种形式,一种是通过 `$name` 属性定义,另一种是通过构造函数传参来定义,我们通过代码示例来演示一下,假设我们希望定义该命令类的命令为 `foo:hello`: #### `$name` 属性定义: ```php line('Hello Hyperf.', 'info'); } } ``` ### 定义命令类的参数 在编写命令时,通常是通过 `参数` 和 `选项` 来收集用户的输入的,在收集一个用户输入前,必须对该 `参数` 或 `选项` 进行定义。 #### 参数 假设我们希望定义一个 `name` 参数,然后通过传递任意字符串如 `Hyperf` 于命令一起并执行 `php bin/hyperf.php foo:hello Hyperf` 输出 `Hello Hyperf`,我们通过代码来演示一下: ```php input->getArgument('name') ?? 'World'; $this->line('Hello ' . $argument, 'info'); } protected function getArguments() { return [ ['name', InputArgument::OPTIONAL, '这里是对这个参数的解释'] ]; } } ``` 执行 `php bin/hyperf.php foo:hello Hyperf` 我们就能看到输出了 `Hello Hyperf` 了。 ## 命令常用配置介绍 以下代码皆只修改 `configure` 和 `handle` 中的内容。 ### 设置 Help ``` public function configure() { parent::configure(); $this->setHelp('Hyperf 自定义命令演示'); } $ php bin/hyperf.php demo:command --help ... Help: Hyperf 自定义命令演示 ``` ### 设置 Description ``` public function configure() { parent::configure(); $this->setDescription('Hyperf Demo Command'); } $ php bin/hyperf.php demo:command --help ... Description: Hyperf Demo Command ``` ### 设置 Usage ``` public function configure() { parent::configure(); $this->addUsage('--name 演示代码'); } $ php bin/hyperf.php demo:command --help ... Usage: demo:command demo:command --name 演示代码 ``` ### 设置参数 参数支持以下模式。 | 模式 | 值 | 备注 | |:-----------------------:|:--:|:-----------------------------------:| | InputArgument::REQUIRED | 1 | 参数必填,此种模式 default 字段无效 | | InputArgument::OPTIONAL | 2 | 参数可选,常配合 default 使用 | | InputArgument::IS_ARRAY | 4 | 数组类型 | #### 可选类型 ``` public function configure() { parent::configure(); $this->addArgument('name', InputArgument::OPTIONAL, '姓名', 'Hyperf'); } public function handle() { $this->line($this->input->getArgument('name')); } $ php bin/hyperf.php demo:command ... Hyperf $ php bin/hyperf.php demo:command Swoole ... Swoole ``` #### 数组类型 ``` public function configure() { parent::configure(); $this->addArgument('name', InputArgument::IS_ARRAY, '姓名'); } public function handle() { var_dump($this->input->getArgument('name')); } $ php bin/hyperf.php demo:command Hyperf Swoole ... array(2) { [0]=> string(6) "Hyperf" [1]=> string(6) "Swoole" } ``` ### 设置选项 选项支持以下模式。 | 模式 | 值 | 备注 | |:---------------------------:|:--:|:------------:| | InputOption::VALUE_NONE | 1 | 是否传入可选项 default 字段无效 | | InputOption::VALUE_REQUIRED | 2 | 选项必填 | | InputOption::VALUE_OPTIONAL | 4 | 选项可选 | | InputOption::VALUE_IS_ARRAY | 4 | 选项数组 | #### 是否传入可选项 ``` public function configure() { parent::configure(); $this->addOption('opt', 'o', InputOption::VALUE_NONE, '是否优化'); } public function handle() { var_dump($this->input->getOption('opt')); } $ php bin/hyperf.php demo:command bool(false) $ php bin/hyperf.php demo:command -o bool(true) $ php bin/hyperf.php demo:command --opt bool(true) ``` ### 选项必填和可选 `VALUE_OPTIONAL` 在单独使用上与 `VALUE_REQUIRED` 并无二致 ``` public function configure() { parent::configure(); $this->addOption('name', 'N', InputOption::VALUE_REQUIRED, '姓名', 'Hyperf'); } public function handle() { var_dump($this->input->getOption('name')); } $ php bin/hyperf.php demo:command string(6) "Hyperf" $ php bin/hyperf.php demo:command --name Swoole string(6) "Swoole" ``` ### 选项数组 `VALUE_IS_ARRAY` 和 `VALUE_OPTIONAL` 配合使用,可以达到传入多个 `Option` 的效果。 ``` public function configure() { parent::configure(); $this->addOption('name', 'N', InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL, '姓名'); } public function handle() { var_dump($this->input->getOption('name')); } $ php bin/hyperf.php demo:command array(0) { } $ php bin/hyperf.php demo:command --name Hyperf --name Swoole array(2) { [0]=> string(6) "Hyperf" [1]=> string(6) "Swoole" } ```