控制台组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
控制台组件
控制台组件简化了创建美丽的和可测试的命令行接口。
控制台组件允许您创建命令行命令。你的控制台命令可用于任何重复的任务,如计划、进口,或其他的批处理作业。
安装
您可以安装组件在两个不同的方面:
- 使用官方的Git存储库(https://github.com/ob娱乐下载symfony/Console);
- 安装它通过作曲家(
ob娱乐下载symfony /控制台
在Packagist)。
请注意
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\命令;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputArgument;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输入\InputOption;使用ob娱乐下载\组件\控制台\输出\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;使用ob娱乐下载\组件\控制台\应用程序;美元应用程序=新应用程序();美元应用程序- >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 (…);}
安静时水平,抑制作为默认所有输出ob娱乐下载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 /控制台演示:问候法效力
也可以让一个参数的值列表(假设您希望迎接你的朋友)。这个月底必须指定参数列表:
1 2 3 4 5 6 7
美元这/ /……- >addArgument (“名字”,InputArgument::IS_ARRAY,“你想问候(单独的多个名称空间)?”);
使用这个,就指定你想要尽可能多的名字:
1
美元app /控制台演示:法比瑞安Bernhard打招呼
您可以访问的名字
参数是一个数组:
1 2 3
如果(美元的名字=美元输入- >getArgument (“名字”)){美元文本=。' '.implode (”、“,美元的名字);}
有三个参数变异可以使用:
选项 | 价值 |
---|---|
InputArgument:需要 | 所需的参数是 |
InputArgument::可选 | 参数是可选的,因此可以省略 |
InputArgument: IS_ARRAY | 参数可以包含一个无限数量的参数,必须使用的参数列表 |
您可以组合IS_ARRAY
与要求
和可选
是这样的:
1 2 3 4 5 6 7
美元这/ /……- >addArgument (“名字”,InputArgument::IS_ARRAY | InputArgument::必需的,“你想问候(单独的多个名称空间)?”);
使用命令选项
与参数,选项并不是命令(这意味着您可以指定任何顺序)和两个破折号(如指定。——大喊
——你也可以声明一个字母的快捷方式,你可以叫一个破折号可能是
)。选项是总是可选的,并且可以设置接受一个值(例如。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);
测试命令
ob娱乐下载Symfony2提供了一些工具来帮助你测试你的命令。最有用的一个是CommandTester类。它使用特殊的输入和输出类来缓解测试没有真正的控制台:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
使用ob娱乐下载\组件\控制台\应用程序;使用ob娱乐下载\组件\控制台\测试人员\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
使用ob娱乐下载\组件\控制台\应用程序;使用ob娱乐下载\组件\控制台\测试人员\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调用命令,重构你的代码和逻辑转移到一个新类。