构建一个单一命令程序

3.4 版本
维护中的版本

当构建一个命令行工具时,你可能不需要提供多个命令。这时,次次都要传入命令的名字(name)是单调乏味的。幸运的是,通过对程序的扩展,删除此种“需求”成为了可能:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
namespace Acme\Tool;
 
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\InputInterface;
 
class MyApplication extends Application
{
    /**
     * Gets the name of the command based on input. 基于input得到命令的名字
     *
     * @param InputInterface $input The input interface
     *
     * @return string The command name
     */
    protected function getCommandName(InputInterface $input)
    {
        // This should return the name of your command. 这里返回你命令的名字
        return 'my_command';
    }
 
    /**
     * Gets the default commands that should always be available. 
     * 取得默认命令,它应该是永远可用的
     * 
     * @return array An array of default Command instances
     */
    protected function getDefaultCommands()
    {
        // Keep the core default commands to have the HelpCommand
        // which is used when using the --help option
        // 保留核心的默认命令以便拥有HelpCommand,在用户使用--help选项时会用到
        $defaultCommands = parent::getDefaultCommands();
 
        $defaultCommands[] = new MyCommand();
 
        return $defaultCommands;
    }
 
    /**
     * Overridden so that the application doesn't expect the command
     * name to be the first argument.
     * 覆写之,以便程序不再预期这个命令的名字作为第一个参数
     */
    public function getDefinition()
    {
        $inputDefinition = parent::getDefinition();
        // clear out the normal first argument, which is the command name
        // 去除通常情况下的第一个参数,也就是命令的名字
        $inputDefinition->setArguments();
 
        return $inputDefinition;
    }
}

当调用你的console脚本时,MyCommand命令将被使用,毋须传入其名字。

同时你还可以简化对该脚本的执行过程:

1
2
3
4
5
6
7
8
#!/usr/bin/env php
<?php
// command.php
 
use Acme\Tool\MyApplication;
 
$application = new MyApplication();
$application->run();

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

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