控制台组件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.0,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

控制台组件

控制台组件简化了创建美丽的和可测试的命令行接口。

控制台组件允许您创建命令行命令。你的控制台命令可用于任何重复的任务,如计划、进口,或其他的批处理作业。

安装

你可以在许多不同的方式:安装组件

请注意

Windows默认不支持ANSI颜色所以控制台组件检测颜色和禁用Windows没有支持的地方。然而,如果没有配置Windows ANSI驱动程序和你的控制台命令调用其他脚本发出ANSI颜色序列,他们将显示为原始转义字符。

请支持ANSI颜色支持Windows安装ANSICON

创建一个基本的命令

做一个欢迎您的控制台命令从命令行,创造GreetCommand.php并添加以下:

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
名称空间Acme\DemoBundle\命令;使用欧宝娱乐app下载地址\组件\控制台\命令\命令;使用欧宝娱乐app下载地址\组件\控制台\输入\InputArgument;使用欧宝娱乐app下载地址\组件\控制台\输入\InputInterface;使用欧宝娱乐app下载地址\组件\控制台\输入\InputOption;使用欧宝娱乐app下载地址\组件\控制台\输出\OutputInterface;GreetCommand扩展命令{受保护的函数配置(){美元- >setName (“演示:问候”)- >setDescription (“欢迎某人”)- >addArgument (“名字”,InputArgument::可选的,“你想问谁?”)- >使用addOption (“喊”,,InputOption::VALUE_NONE,如果设置,任务会大喊大写字母的);}受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){美元的名字=美元输入- >getArgument (“名字”);如果(美元的名字){美元文本=“你好”美元的名字;}其他的{美元文本=“你好”;}如果(美元输入- >getOption (“喊”)){美元文本= strtoupper (美元文本);}美元输出- >writeln (美元文本);}}

您还需要创建的文件运行命令行创建一个应用程序并添加命令:

1 2 3 4 5 6 7 8 9 10
# !/usr/bin/env php< ? php/ /应用程序/控制台使用Acme\DemoBundle\命令\GreetCommand;使用欧宝娱乐app下载地址\组件\控制台\应用程序;美元应用程序=应用程序();美元应用程序- >add (GreetCommand);美元应用程序- >run ();

测试新控制台通过运行以下命令

1
美元app /控制台演示:欢迎法比安

这将打印以下命令行:

1
你好,法比安

您还可以使用——大喊选项让所有大写:

1
美元app /控制台演示:问候法——大喊

这个打印:

1
你好,法比安

着色的输出

每当你输出文本,你可以围绕其输出标签的文本颜色。例如:

1 2 3 4 5 6 7 8 9 10 11
/ /绿色文本美元输出- >writeln (“foo <信息> < /信息>”);/ /黄色文本美元输出- >writeln (“foo <评论> < /评论>”);/ /青色背景上的黑色文字美元输出- >writeln (“foo <问题> < /问题>”);/ /白色背景上的红色文字美元输出- >writeln (“<错误> foo > < /错误”);

可以使用类定义您自己的风格OutputFormatterStyle:

1 2 3
美元风格=OutputFormatterStyle (“红色”,“黄色”,数组(“大胆”,“眨眼”));美元输出- >getformat ()- >setStyle (“火”,美元风格);美元输出- >writeln (“foo <火> < /火>”);

可用的前景色和背景色:黑色的,红色的,绿色,黄色的,蓝色的,品红色的,青色白色的

和可用的选项是:大胆的,下划线,眨眼,反向隐藏

你也可以设置这些颜色和选择tagname内:

1 2 3 4 5 6 7 8
/ /绿色文本美元输出- >writeln (' < fg =绿色> foo <绿色/ fg = > ');/ /青色背景上的黑色文字美元输出- >writeln (' < fg =黑色;bg =青色> foo < / fg =黑,bg =青色>”);/ /粗体文本在一个黄色的背景上美元输出- >writeln (' < bg =黄色;选项=大胆> foo < / bg =黄色;选项=大胆>”);

冗长的水平

控制台有3个水平的冗长。这些都是中定义OutputInterface:

选项 价值
OutputInterface: VERBOSITY_QUIET 不输出任何消息
OutputInterface: VERBOSITY_NORMAL 默认的详细级别
OutputInterface: VERBOSITY_VERBOSE 增加了冗长的消息

您可以指定安静的冗长的水平——安静q选择。的——详细- v选项是使用当您希望增加水平的冗长。

提示

加亮印,如果完整的异常VERBOSITY_VERBOSE使用水平。

可以在一个命令打印一条消息只有一个特定的冗长的水平。例如:

1 2 3
如果(OutputInterface::VERBOSITY_VERBOSE = = =美元输出- >getVerbosity ()) {美元输出- >writeln (…);}

安静时水平,抑制作为默认所有输出欧宝娱乐app下载地址Symfony \组件\ \控制台输出:写作方法返回不打印。

使用命令参数

最有趣的部分命令的参数和选项,您可以提供。参数的字符串-用空格分开后命令名称本身。他们命令,可以是可选的还是必需的。例如,添加一个可选的last_name参数,使的命令的名字参数要求:

1 2 3 4 5 6 7 8 9 10 11 12
美元/ /……- >addArgument (“名字”,InputArgument::必需的,“你想问谁?”)- >addArgument (“last_name”,InputArgument::可选的,“你的姓吗?”);

现在,您已经访问last_name命令参数:

1 2 3
如果(美元=美元输入- >getArgument (“last_name”)){美元文本=。' '美元;}

命令,现在可以用于以下方面:

1 2
美元app /控制台演示:问候法比美元app /控制台演示:问候法效力

使用命令选项

与参数,选项并不是命令(这意味着您可以指定任何顺序)和两个破折号(如指定。——大喊——你也可以声明一个字母的快捷方式,你可以叫一个破折号可能是)。选项是总是可选的,并且可以设置接受一个值(例如。dir = src)或仅仅是一个布尔标志(如没有价值。大喊)。

提示

也可以做一个选择(可选)接受一个值(这样——大喊大声喊=工作)。选项也可以配置为接受一组值。

例如,添加一个新选项的命令可以被用来指定多少次连续消息应该打印:

1 2 3 4 5 6 7 8 9
美元/ /……- >使用addOption (“迭代”,,InputOption::VALUE_REQUIRED,的消息应该打印多少次?”,1);

接下来,使用这个命令打印消息多次:

1 2 3
(美元=0;美元<美元输入- >getOption (“迭代”);美元+ +){美元输出- >writeln (美元文本);}

现在,当您运行任务,您可以选择指定一个——迭代国旗:

1 2
美元app /控制台演示:问候法比美元app /控制台演示:问候法比安-迭代= 5

第一个例子只能打印一次,迭代是空的,违约1(最后一个参数使用addOption)。第二个例子将打印五次。

回想一下,选择不关心他们的订单。所以,下面的工作:

1 2
美元app /控制台演示:迎接法——迭代= 5美元——大喊app /控制台演示:问候法——大喊——迭代= 5

有4个选项变量可以使用:

选项 价值
InputOption: VALUE_IS_ARRAY 这个选项接受多个值(如。- - - dir = / foo - dir = /酒吧)
InputOption: VALUE_NONE (如不接受输入的选项。——大喊)
InputOption: VALUE_REQUIRED 这个值是必需的(如。——迭代= 5),选择本身仍然是可选的
InputOption: VALUE_OPTIONAL 此选项可能有也可能没有一个值(例如大喊大声喊=)

你可以结合VALUE_IS_ARRAY VALUE_REQUIRED或VALUE_OPTIONAL是这样的:

1 2 3 4 5 6 7 8 9
美元/ /……- >使用addOption (“迭代”,,InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,的消息应该打印多少次?”,1);

控制台助手

控制台组件还包含一组“助手”——不同的小工具能够帮助你与不同的任务:

测试命令

欧宝娱乐app下载地址Symfony2提供了一些工具来帮助你测试你的命令。最有用的一个是CommandTester类。它使用特殊的输入和输出类来缓解测试没有真正的控制台:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
使用欧宝娱乐app下载地址\组件\控制台\应用程序;使用欧宝娱乐app下载地址\组件\控制台\测试人员\CommandTester;使用Acme\DemoBundle\命令\GreetCommand;ListCommandTest扩展\PHPUnit_Framework_TestCase{公共函数testExecute(){美元应用程序=应用程序();美元应用程序- >add (GreetCommand ());美元命令=美元应用程序- >找到(“演示:问候”);美元commandTester=CommandTester (美元命令);美元commandTester- >执行(数组(“命令”= >美元命令- >getName ()));美元- >assertRegExp (“/……”,美元commandTester- >getDisplay ());/ /……}}

getDisplay ()方法返回本来会从控制台显示在电话正常。

您可以测试发送参数和选项的命令通过他们为一个数组execute ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
使用欧宝娱乐app下载地址\组件\控制台\应用程序;使用欧宝娱乐app下载地址\组件\控制台\测试人员\CommandTester;使用Acme\DemoBundle\命令\GreetCommand;ListCommandTest扩展\PHPUnit_Framework_TestCase{/ /……公共函数testNameIsOutput(){美元应用程序=应用程序();美元应用程序- >add (GreetCommand ());美元命令=美元应用程序- >找到(“演示:问候”);美元commandTester=CommandTester (美元命令);美元commandTester- >执行(数组(“命令”= >美元命令- >getName (),“名字”= >“法”));美元- >assertRegExp (“/法/”,美元commandTester- >getDisplay ());}}

提示

你也可以测试一个控制台应用程序通过使用ApplicationTester

调用现有的命令

如果正在运行一个命令取决于另一个,而不是让用户记住执行的顺序,你可以直接叫它自己。这也是有用的,如果你想创建一个“元”命令,只是一堆运行其他命令(例如,所有的命令都需要运行时项目的代码已经改变了在生产服务器上:清理缓存,生成Doctrine2代理,倾销Assetic资产,…)。

从另一个调用命令很简单:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){美元命令=美元- >getApplication ()- >找到(“演示:问候”);美元参数=数组(“命令”= >“演示:问候”,“名字”= >“法”,”,大喊“= >真正的,);美元输入=ArrayInput (美元参数);美元returnCode=美元命令- >运行(美元输入,美元输出);/ /……}

首先,你find ()您想要执行的命令通过命令名称。

然后,您需要创建一个新的ArrayInput的参数和选择你想传递给命令。

最终,调用run ()方法实际上执行命令并返回从命令返回的代码(从命令的返回值execute ()方法)。

请注意

大多数时候,调用一个命令从命令行上执行的代码不是并不是一个好主意有几个原因。首先,该命令的输出是优化的控制台。但更重要的是,你能想到的一个命令是像一个控制器;它应该使用模型做一些和显示反馈给用户。因此,而不是从Web调用命令,重构你的代码和逻辑转移到一个新类。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。