理解控制台参数是如何被操作的

3.4 版本
维护中的版本

要理解console程序的参数处理方式是比较困难的。Symfony Console application,像很多其他的CLI工具一样,遵循的是 docopt 标准中所描述的行为。

看看下面这个拥有三个选项的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
namespace Acme\Console\Command;
 
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
 
class DemoArgsCommand extends Command
{
    protected function configure()
    {
        $this
            ->setName('demo:args')
            ->setDescription('Describe args behaviors')
            ->setDefinition(
                new InputDefinition(array(
                    new InputOption('foo', 'f'),
                    new InputOption('bar', 'b', InputOption::VALUE_REQUIRED),
                    new InputOption('cat', 'c', InputOption::VALUE_OPTIONAL),
                ))
            );
    }
 
    protected function execute(InputInterface $input, OutputInterface $output)
    {
       // ...
    }
}

由于 foo 选项并不接收一个值,它将是 false(若它未传入命令)或 true(当--foo被用户传入)。bar 选项的值(以及它的 b 快捷方式)是必填项。它(该值)可以从选项名称中以空格或=字符给分离出来。cat 选项(连同其 c 快捷方式)的表现是类似的,但它并非必填项因此不需要一个值。看一眼下面的列表,了解传入的选项的可能组合方式:

Input foo bar cat
--bar=Hello false "Hello" null
--bar Hello false "Hello" null
-b=Hello false "=Hello" null
-b Hello false "Hello" null
-bHello false "Hello" null
-fcWorld -b Hello true "Hello" "World"
-cfWorld -b Hello false "Hello" "fWorld"
-cbWorld false null "bWorld"

当命令也接收一个可选参数时,事情变得更加复杂:

1
2
3
4
5
6
7
// ...
 
new InputDefinition(array(
    // ...
    new InputArgument('arg', InputArgument::OPTIONAL),
));
 

你可能已经使用了特殊的 -- 分隔符来从参数中分离出选项。看一看下面列表中的第五行,这种用法告诉命令:Worldarg 参数的值,而不是可选的 cat 选项的值:

Input bar cat arg
--bar Hello "Hello" null null
--bar Hello World "Hello" null "World"
--bar "Hello World" "Hello World" null null
--bar Hello --cat World "Hello" "World" null
--bar Hello --cat -- World "Hello" null "World"
-b Hello -c World "Hello" "World" null

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)