控制台组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.6,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
控制台组件
Console组件简化了漂亮且可测试的命令行接口的创建。
Console组件允许您创建命令行命令。控制台命令可用于任何循环任务,如cronjob、导入或其他批作业。
安装
你可以用两种不同的方式安装组件:
- 通过Composer安装(
ob娱乐下载symfony /控制台
在Packagist); - 使用官方Git存储库(https://github.com/ob娱乐下载symfony/Console).
然后,要求供应商/ autoload.php
文件以启用Composer提供的自动加载机制。否则,您的应用程序将无法找到这个Symfony组件的类。ob娱乐下载
创建基本命令
若要创建一个从命令行欢迎您的控制台命令,请创建GreetCommand.php
并添加以下内容:
12 34 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 ($文本);}}
还需要创建在命令行上运行的文件,该命令行创建一个应用程序
并向其添加命令:
12 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演示:欢迎Fabien
这将打印以下内容到命令行:
1
你好,法比安
你也可以使用——大喊
选项,使一切大写:
1
php演示:向Fabien问好
这个打印:
1
你好,法比安
为输出上色
请注意
默认情况下,Windows命令控制台不支持输出着色。Console组件禁止Windows系统的输出着色,但是如果您的命令调用了发出颜色序列的其他脚本,它们将被错误地显示为原始转义字符。安装ConEmu或ANSICON免费应用程序添加着色支持到您的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
常量在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
如果($输出->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {$输出->writeln(…);}
你还可以使用更多的语义方法来测试每个冗长级别:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
如果($输出->isQuiet ()) {/ /……}如果($输出->isVerbose ()) {/ /……}如果($输出->isVeryVerbose ()) {/ /……}如果($输出->isDebug ()) {/ /……}
请注意
方法中定义了这些语义方法OutputInterface
从Symfony 3.0开始ob娱乐下载。在以前的Symfony版ob娱乐下载本中,它们是在接口的不同实现中定义的。输出),以保持向后兼容性。
当使用安静级别时,所有输出都被抑制为默认值write ()方法返回而不实际打印。
提示
MonologBridge提供了一个ConsoleHandler类,它允许您在控制台上显示消息。这比在条件中包装输出调用更简洁。有关Symfony框架中的示例,请参见ob娱乐下载如何配置独白显示控制台消息.
使用命令参数
命令中最有趣的部分是可以使用的参数和选项。参数是命令名称本身后面的字符串(由空格分隔)。它们是有序的,可以是可选的,也可以是必需的。例如,添加一个可选选项last_name
参数,并使的名字
参数要求:
12 3 4 5 6 7 8 9 10 11 12
$这/ /……->addArgument (“名字”, InputArgument::必需的,“你想和谁打招呼?”)->addArgument (“last_name”, InputArgument::可选的,“你姓什么?”);
您现在可以访问alast_name
命令中的参数:
1 2 3
如果($姓=$输入->getArgument (“last_name”)) {$文本=。' '.$姓;}
该命令现在可以以以下两种方式使用:
1 2
$ php application.php demo:greet Fabien Potencier
也可以让一个参数接受一个值列表(假设你想问候你所有的朋友)。为此,它必须在参数列表的末尾指定:
1 2 3 4 5 6 7
$这/ /……->addArgument (“名字”, InputArgument::IS_ARRAY,“你想和谁打招呼(多个名字用空格隔开)?”);
要使用它,只需指定尽可能多的名称:
1
欢迎Fabien Ryan Bernhard
您可以访问的名字
参数作为数组:
1 2 3
如果($的名字=$输入->getArgument (“名字”)) {$文本=。' '.implode (”、“,$的名字);}
你可以使用三种参数变体:
模式 | 价值 |
---|---|
InputArgument:需要 |
参数是必需的 |
InputArgument::可选 |
参数是可选的,因此可以省略 |
InputArgument: IS_ARRAY |
实参可以包含不确定数量的实参,并且必须在实参列表的末尾使用 |
你可以结合IS_ARRAY
与要求
而且可选
是这样的:
1 2 3 4 5 6 7
$这/ /……->addArgument (“名字”, InputArgument::IS_ARRAY |输入数据::必需的,“你想和谁打招呼(多个名字用空格隔开)?”);
使用命令选项
与参数不同,选项是没有顺序的(这意味着您可以以任何顺序指定它们),并且用两个破折号指定(例如。——大喊
-你也可以声明一个单字母的快捷方式,你可以用一个破折号调用可能是
).选项是总是可选的,可以设置为接受一个值(例如。- - - dir = src
)或简单地作为布尔标志而不带值(例如:——大喊
).
提示
没有什么可以禁止您创建带有可选接受值的选项的命令。但是,如果没有值,则无法区分何时使用了该选项(命令,大喊
)或者根本不用的时候(命令
).在这两种情况下,为选项检索的值都是零
.
例如,在命令中添加一个新选项,用于指定消息在一行中应该打印多少次:
1 2 3 4 5 6 7 8 9
$这/ /……->使用addOption (“迭代”,零, InputOption::VALUE_REQUIRED,“这条信息应该打印几次?”,1);
接下来,在命令中使用this多次打印消息:
1 2 3
为($我=0;$我<$输入->getOption (“迭代”);$我+ +) {$输出->writeln ($文本);}
现在,当您运行任务时,您可以选择指定——迭代
国旗:
1 2
$ php application.php demo:greet Fabien—iterations=5
第一个例子只打印一次,因为迭代
为空,默认为1
的最后一个论点使用addOption
).第二个示例将打印五次。
请记住,选项并不关心它们的顺序。所以,下面的任何一个都可以工作:
1 2
$ php application.php demo:greet Fabien—yell—iterations=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 |输入::VALUE_IS_ARRAY,“你喜欢什么颜色?”,数组(“蓝”,“红色”));
控制台助手
控制台组件还包含一组“助手”——不同的小工具,能够帮助你完成不同的任务:
测试命令
ob娱乐下载Symfony提供了几个工具来帮助您测试命令。最有用的是CommandTester类。它使用特殊的输入和输出类来简化测试,而无需真正的控制台:
12 3 4 5 6 7 8 9 10 11 12 13 14 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 ()方法:
12 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资产……),这也是有用的。
从另一个命令调用一个命令很简单:
12 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调用命令,不如重构代码并将逻辑移到新类中。