控制台组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
控制台组件
控制台组件简化了创建美丽的和可测试的命令行接口。
控制台组件允许您创建命令行命令。你的控制台命令可用于任何重复的任务,如计划、进口,或其他的批处理作业。
安装
您可以安装组件在两个不同的方面:
- 安装它通过作曲家(
ob娱乐下载symfony /控制台
在Packagist); - 使用官方的Git存储库(https://github.com/ob娱乐下载symfony/console)。
然后,需要供应商/ autoload.php
文件,使作曲家提供的半自动的机制。否则,您的应用程序无法找到这个Symfony组件的类。ob娱乐下载
创建一个基本的命令
做一个欢迎您的控制台命令从命令行,创造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\控制台\命令;使用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 11 12
# !/usr/bin/env php< ? php/ / application.php需要__DIR__。“/供应商/ autoload.php”;使用Acme\控制台\命令\GreetCommand;使用ob娱乐下载\组件\控制台\应用程序;美元应用程序=新应用程序();美元应用程序- >add (新GreetCommand ());美元应用程序- >run ();
测试新控制台通过运行以下命令
1
美元的php应用程序中。php演示:欢迎法比安
这将打印以下命令行:
1
你好,法比安
您还可以使用——大喊
选项让所有大写:
1
美元的php应用程序中。php演示:问候法——大喊
这个打印:
1
你好,法比安
命令的生命周期
命令有三个生命周期方法:
- 初始化() (可选)
-
这个方法之前执行
(交互)
和execute ()
方法。它的主要目的是使用初始化变量命令的其他方法。 - (交互) (可选)
-
该方法后执行
初始化()
之前,execute ()
。其目的是检查的一些选项/参数是否失踪,交互式地问用户输入这些值。这是最后的地方你可以询问丢失的选项和参数。这个命令后,失踪的选项/参数会导致一个错误。 - execute () (必需)
-
该方法后执行
(交互)
和初始化()
。它包含了你想要的逻辑执行的命令。
着色的输出
请注意
默认情况下,窗口命令控制台不支持输出着色。控制台组件禁用输出颜色为Windows系统,但如果你的命令调用其他脚本发出颜色序列,他们会错误地显示为原始的转义字符。安装cmd,ConEmu,ANSICON或Mintty(默认情况下用于GitBash和Cygwin)免费应用程序添加色素支持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
使用ob娱乐下载\组件\控制台\格式化程序\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_VERBOSE
和VERBOSITY_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 (…);}
安静时水平,抑制作为默认所有输出write ()方法返回不打印。
使用命令参数
最有趣的部分命令的参数和选项,您可以提供。参数的字符串-用空格分开后命令名称本身。他们命令,可以是可选的还是必需的。例如,添加一个可选的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_ARRAY
与VALUE_REQUIRED
或VALUE_OPTIONAL
是这样的:
1 2 3 4 5 6 7 8 9
美元这/ /……- >使用addOption (“颜色”,零,InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,“你喜欢哪个颜色?”,数组(“蓝”,“红色”));
控制台助手
控制台组件还包含一组“助手”——不同的小工具能够帮助你与不同的任务:
测试命令
ob娱乐下载Symfony提供了一些工具来帮助你测试你的命令。最有用的一个是CommandTester类。它使用特殊的输入和输出类来缓解测试没有真正的控制台:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
使用Acme\控制台\命令\GreetCommand;使用ob娱乐下载\组件\控制台\应用程序;使用ob娱乐下载\组件\控制台\测试人员\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;使用ob娱乐下载\组件\控制台\应用程序;使用ob娱乐下载\组件\控制台\测试人员\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的内置命令可能不适合这种方式。ob娱乐下载例如,缓存:清晰
和缓存:热身
命令改变一些类定义,所以运行后他们可能会打破的东西。
请注意
大多数时候,调用一个命令从命令行上执行的代码不是并不是一个好主意有几个原因。首先,该命令的输出是优化的控制台。但更重要的是,你能想到的一个命令是像一个控制器;它应该使用模型做一些和显示反馈给用户。因此,而不是从Web调用命令,重构你的代码和逻辑转移到一个新类。