控制台组件

编辑该页面

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

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

控制台组件

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

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

安装

您可以安装组件在两个不同的方面:

然后,需要供应商/ autoload.php文件,使作曲家提供的半自动的机制。否则,您的应用程序无法找到这个Symfony组件的类。欧宝娱乐app下载地址

创建一个基本的命令

做一个欢迎您的控制台命令从命令行,创造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\控制台\命令;使用欧宝娱乐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 11 12
# !/usr/bin/env php< ? php/ / application.php需要__DIR__“/供应商/ autoload.php”;使用Acme\控制台\命令\GreetCommand;使用欧宝娱乐app下载地址\组件\控制台\应用程序;美元应用程序=应用程序();美元应用程序- >add (GreetCommand ());美元应用程序- >run ();

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

1
美元的php应用程序中。php演示:欢迎法比安

这将打印以下命令行:

1
你好,法比安

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

1
美元的php应用程序中。php演示:问候法——大喊

这个打印:

1
你好,法比安

着色的输出

请注意

默认情况下,窗口命令控制台不支持输出着色。控制台组件禁用输出颜色为Windows系统,但如果你的命令调用其他脚本发出颜色序列,他们会错误地显示为原始的转义字符。安装ConEmuANSICON免费的应用程序添加色素支持你的Windows命令控制台。

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

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

关闭标签可以取而代之< / >去年建立的,撤销所有格式化选项打开标签。

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

1 2 3 4 5 6
使用欧宝娱乐app下载地址\组件\控制台\格式化程序\OutputFormatterStyle;/ /……美元风格=OutputFormatterStyle (“红色”,“黄色”,数组(“大胆”,“眨眼”));美元输出- >getformat ()- >setStyle (“火”,美元风格);美元输出- >writeln (' <火> foo < / > ');

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

和可用的选项是:大胆的,下划线,眨眼,反向(使“反向视频”模式的背景和前景颜色交换)隐藏(将前景颜色设置为透明,使输入文本看不见——尽管它可以选择和复制;这个选项通常要求用户输入敏感信息时使用)。

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

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

冗长的水平

2.3

VERBOSITY_VERY_VERBOSEVERBOSITY_DEBUG常量是在version 2.3中引入的

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

价值 意义 控制台选项
OutputInterface: VERBOSITY_QUIET 不输出任何消息 q——安静
OutputInterface: VERBOSITY_NORMAL 默认的详细级别 (没有)
OutputInterface: VERBOSITY_VERBOSE 增加了冗长的消息 - v
OutputInterface: VERBOSITY_VERY_VERBOSE 信息非必要信息 vv
OutputInterface: VERBOSITY_DEBUG 调试消息 -vvv

提示

加亮印,如果完整的异常VERBOSITY_VERBOSE级或以上。

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

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

还有更多的语义方法您可以使用它来测试每个冗长的级别:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
如果(美元输出- >isQuiet ()) {/ /……}如果(美元输出- >isVerbose ()) {/ /……}如果(美元输出- >isVeryVerbose ()) {/ /……}如果(美元输出- >isDebug ()) {/ /……}

请注意

这些语义方法中定义OutputInterface3.0从Symfony。欧宝娱乐app下载地址在以前的Symfony版欧宝娱乐app下载地址本定义接口的不同实现(如。输出为了保持向后兼容性。

安静时水平,抑制作为默认所有输出write ()方法返回不打印。

提示

MonologBridge提供了一个ConsoleHandler类,它允许您在控制台上显示消息。这比包装干净你的输出调用条件。例如使用Symfony框架中,看到的欧宝娱乐app下载地址如何配置独白显示控制台消息吗

使用命令参数

最有趣的部分命令的参数和选项,您可以提供。参数的字符串-用空格分开后命令名称本身。他们命令,可以是可选的还是必需的。例如,添加一个可选的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
美元的php应用程序中。php演示:问候法比php应用程序。php演示:问候法效力

也可以让一个参数的值列表(假设您希望迎接你的朋友)。这个月底必须指定参数列表:

1 2 3 4 5 6 7
美元/ /……- >addArgument (“名字”,InputArgument::IS_ARRAY,“你想问候(单独的多个名称空间)?”);

使用这个,就指定你想要尽可能多的名字:

1
美元的php应用程序中。php演示:法比瑞安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
美元的php应用程序中。php演示:问候法比php应用程序。php演示:迎接法——迭代= 5

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

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

1 2
美元的php应用程序中。php演示:问候法——迭代= 5美元大喊php应用程序中。php演示:问候法——大喊——迭代= 5

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

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

您可以组合VALUE_IS_ARRAYVALUE_REQUIREDVALUE_OPTIONAL是这样的:

1 2 3 4 5 6 7 8 9
美元/ /……- >使用addOption (“颜色”,,InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,“你喜欢哪个颜色?”,数组(“蓝”,“红色”));

控制台助手

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

测试命令

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

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

提示

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

调用现有的命令

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

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

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

首先,你find ()您想要执行的命令通过命令名称。然后,您需要创建一个新的ArrayInput的参数和选择你想传递给命令。

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

提示

如果你想抑制执行命令的输出,通过NullOutput作为第二个参数$命令- > execute ()

谨慎

注意所有的命令将运行在相同的进程和一些Symfony的内置命令可能不适合这种方式。欧宝娱乐app下载地址例如,缓存:清晰缓存:热身命令改变一些类定义,所以运行后他们可能会打破的东西。

请注意

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

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