2019-06-21 18:14:17 +08:00
|
|
|
|
# 命令行
|
|
|
|
|
|
2019-10-22 09:35:48 +08:00
|
|
|
|
Hyperf 的命令行默认由 [hyperf/command](https://github.com/hyperf/command) 组件提供,而该组件本身也是基于 [symfony/console](https://github.com/symfony/console) 的抽象。
|
2019-06-21 18:14:17 +08:00
|
|
|
|
|
|
|
|
|
# 安装
|
|
|
|
|
|
2019-10-22 09:35:48 +08:00
|
|
|
|
通常来说该组件会默认存在,但如果您希望用于非 Hyperf 项目,也可通过下面的命令依赖 [hyperf/command](https://github.com/hyperf/command) 组件:
|
2019-06-21 18:14:17 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
composer require hyperf/command
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# 查看命令列表
|
|
|
|
|
|
|
|
|
|
直接运行 `php bin/hyperf.php` 不带任何的参数即为输出命令列表。
|
|
|
|
|
|
|
|
|
|
# 自定义命令
|
|
|
|
|
|
|
|
|
|
## 生成命令
|
|
|
|
|
|
2019-10-22 09:35:48 +08:00
|
|
|
|
如果你有安装 [hyperf/devtool](https://github.com/hyperf/devtool) 组件的话,可以通过 `gen:command` 命令来生成一个自定义命令:
|
2019-06-21 18:14:17 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
php bin/hyperf.php gen:command FooCommand
|
|
|
|
|
```
|
|
|
|
|
执行上述命令后,便会在 `app/Command` 文件夹内生成一个配置好的 `FooCommand` 类了。
|
|
|
|
|
|
|
|
|
|
### 定义命令
|
|
|
|
|
|
|
|
|
|
定义该命令类所对应的命令有两种形式,一种是通过 `$name` 属性定义,另一种是通过构造函数传参来定义,我们通过代码示例来演示一下,假设我们希望定义该命令类的命令为 `foo:hello`:
|
|
|
|
|
|
|
|
|
|
#### `$name` 属性定义:
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
namespace App\Command;
|
|
|
|
|
|
|
|
|
|
use Hyperf\Command\Command as HyperfCommand;
|
|
|
|
|
use Hyperf\Command\Annotation\Command;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Command
|
|
|
|
|
*/
|
|
|
|
|
class FooCommand extends HyperfCommand
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* 执行的命令行
|
|
|
|
|
*
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
|
|
|
|
protected $name = 'foo:hello';
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 构造函数传参定义:
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
namespace App\Command;
|
|
|
|
|
|
|
|
|
|
use Hyperf\Command\Command as HyperfCommand;
|
|
|
|
|
use Hyperf\Command\Annotation\Command;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Command
|
|
|
|
|
*/
|
|
|
|
|
class FooCommand extends HyperfCommand
|
|
|
|
|
{
|
|
|
|
|
public function __construct()
|
|
|
|
|
{
|
|
|
|
|
parent::__construct('foo:hello');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 定义命令类逻辑
|
|
|
|
|
|
|
|
|
|
命令类实际运行的逻辑是取决于 `handle` 方法内的代码,也就意味着 `handle` 方法就是命令的入口。
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
namespace App\Command;
|
|
|
|
|
|
|
|
|
|
use Hyperf\Command\Command as HyperfCommand;
|
|
|
|
|
use Hyperf\Command\Annotation\Command;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Command
|
|
|
|
|
*/
|
|
|
|
|
class FooCommand extends HyperfCommand
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* 执行的命令行
|
|
|
|
|
*
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
|
|
|
|
protected $name = 'foo:hello';
|
|
|
|
|
|
|
|
|
|
public function handle()
|
|
|
|
|
{
|
|
|
|
|
// 通过内置方法 line 在 Console 输出 Hello Hyperf.
|
|
|
|
|
$this->line('Hello Hyperf.', 'info');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 定义命令类的参数
|
|
|
|
|
|
|
|
|
|
在编写命令时,通常是通过 `参数` 和 `选项` 来收集用户的输入的,在收集一个用户输入前,必须对该 `参数` 或 `选项` 进行定义。
|
|
|
|
|
|
|
|
|
|
#### 参数
|
|
|
|
|
|
|
|
|
|
假设我们希望定义一个 `name` 参数,然后通过传递任意字符串如 `Hyperf` 于命令一起并执行 `php bin/hyperf.php foo:hello Hyperf` 输出 `Hello Hyperf`,我们通过代码来演示一下:
|
|
|
|
|
|
|
|
|
|
```php
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
namespace App\Command;
|
|
|
|
|
|
|
|
|
|
use Hyperf\Command\Annotation\Command;
|
|
|
|
|
use Hyperf\Command\Command as HyperfCommand;
|
2019-08-23 14:50:00 +08:00
|
|
|
|
use Symfony\Component\Console\Input\InputArgument;
|
2019-06-21 18:14:17 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Command
|
|
|
|
|
*/
|
|
|
|
|
class FooCommand extends HyperfCommand
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* 执行的命令行
|
|
|
|
|
*
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
|
|
|
|
protected $name = 'foo:hello';
|
|
|
|
|
|
|
|
|
|
public function handle()
|
|
|
|
|
{
|
|
|
|
|
// 从 $input 获取 name 参数
|
|
|
|
|
$argument = $this->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` 了。
|
|
|
|
|
|
2019-12-03 18:04:14 +08:00
|
|
|
|
|
|
|
|
|
## 命令常用配置介绍
|
|
|
|
|
|
|
|
|
|
以下代码皆只修改 `configure` 中的内容。
|
|
|
|
|
|
|
|
|
|
### 设置 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"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|