如何设置控制台命令的样式
编辑本页如何设置控制台命令的样式
创建控制台命令时最无聊的任务之一是处理命令输入和输出的样式。显示标题和表格或向用户询问问题涉及大量重复的代码。
例如,考虑用于显示以下命令标题的代码:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src /命令/ GreetCommand.php名称空间应用程序\命令;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;类GreetCommand扩展命令{/ /……受保护的函数执行(InputInterface$输入, OutputInterface$输出):int{$输出->writeln (['Lorem Ipsum Dolor Sit met>' ,' <信息 >==========================>',”]);/ /……}}
显示一个简单的标题需要三行代码来更改字体颜色、下划线内容以及在标题后留下额外的空白行。设计良好的命令需要处理样式,但这会不必要地使代码复杂化。
为了减少样板代码,Symfony命令可以选择使用ob娱乐下载ob娱乐下载Symfony风格指南.这些样式被实现为一组帮助器方法,允许创建语义命令,忘记它们的样式。
基本用法
在命令中,实例化ob娱乐下载SymfonyStyle类,并传递输入美元
而且输出美元
变量作为它的参数。然后,您可以开始使用它的任何帮助程序,例如标题()
,显示命令的标题:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src /命令/ GreetCommand.php名称空间应用程序\命令;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;使用ob娱乐下载\组件\控制台\风格\ob娱乐下载SymfonyStyle;类GreetCommand扩展命令{/ /……受保护的函数执行(InputInterface$输入, OutputInterface$输出):int{$io=新ob娱乐下载SymfonyStyle ($输入,$输出);$io->标题(" Lorem Ipsum Dolor Sit Amet ");/ /……}}
辅助方法
的ob娱乐下载SymfonyStyle类定义了一些帮助器方法,这些方法涵盖了控制台命令执行的最常见的交互。
内容的方法
- text ()
-
它将给定的字符串或字符串数组显示为常规文本。这对于为运行命令的用户提供帮助消息和指令非常有用:
1 2 3 4 5 6 7 8 9 10 11
//在短消息中使用简单字符串$io->文本(" Lorem ipsum dolor sit amet ");/ /……//考虑在显示长消息时使用数组$io->文本([" Lorem ipsum dolor sit amet ",“圣贤”,"埃涅安坐见生命之门"]);
- 清单()
-
它显示作为数组传递的无序元素列表:
1 2 3 4 5
$io->清单([元素#1 Lorem ipsum dolor sit amet,元素2 Lorem ipsum dolor sit amet,元素#3 Lorem ipsum dolor sit amet]);
- 表()
-
它将给定的标题和行数组显示为一个紧凑的表:
1 2 3 4 5 6 7 8
$io->表([“标题1”,“标题2”], [[“细胞1 - 1”,“细胞1 - 2”]、[“细胞2 - 1”,“细胞2 - 2”]、[“细胞3 - 1”,“细胞3 - 2”],]);
- horizontalTable ()
-
它将给定的标题和行数组显示为一个紧凑的水平表:
1 2 3 4 5 6 7 8
$io->horizontalTable ([“标题1”,“标题2”], [[“细胞1 - 1”,“细胞1 - 2”]、[“细胞2 - 1”,“细胞2 - 2”]、[“细胞3 - 1”,“细胞3 - 2”],]);
- definitionList ()
-
它显示给定的
Key =>值
作为元素的紧凑列表:1 2 3 4 5 6 7 8 9
$io->definitionList (“这是一个头衔”, (“foo1”= >“bar1”]、[“foo2”= >“bar2”]、[“foo3”= >“bar3”),新TableSeparator (),“这是另一个标题”, (“foo4”= >“bar4”]);
- 不知道()
- 的实例表格根据Symfony样式指南进行样式化,该指南允许ob娱乐下载您使用动态附加行等特性。
- 换行符()
-
在命令回显中显示空行。虽然它看起来很有用,但大多数时候你根本不需要它。原因是每个helper都已经添加了自己的空行,所以你不必关心垂直间距:
1 2 3 4 5
//输出一个空行$io->换行符();//输出三个连续的空行$io->换行符(3.);
警告的方法
- 注意()
-
它将给定的字符串或字符串数组作为高亮警告显示。请谨慎使用此帮助器,以避免命令输出混乱:
1 2 3 4 5 6 7 8 9 10 11
//在短音符中使用简单的字符串$io->注意(" Lorem ipsum dolor sit amet ");/ /……//考虑在显示长音符时使用数组$io->注意([" Lorem ipsum dolor sit amet ",“圣贤”,"埃涅安坐见生命之门"]);
- 谨慎()
-
类似于
注意()
Helper,但内容更突出显示。结果内容类似于一个错误消息,所以你应该避免使用这个帮助器,除非绝对必要:1 2 3 4 5 6 7 8 9 10 11
//使用简单的字符串来表示简短的警告信息$io->谨慎(" Lorem ipsum dolor sit amet ");/ /……//考虑在显示较长的警告消息时使用数组$io->谨慎([" Lorem ipsum dolor sit amet ",“圣贤”,"埃涅安坐见生命之门"]);
进度条方法
- progressStart ()
-
它将显示一个进度条,其中的步骤数与传递给方法的参数相等(如果进度条的长度未知,则不要传递任何值):
1 2 3 4 5
//显示未知长度的进度条$io->progressStart ();//显示100步长的进度条$io->progressStart (One hundred.);
- progressAdvance ()
-
它使进度条向前推进给定的步骤数(或
1
步骤(如果没有传递参数):1 2 3 4 5
//将进度条向前推进一步$io->progressAdvance ();//将进度条向前推进10步$io->progressAdvance (10);
- progressFinish ()
-
它完成进度条(当它的长度已知时,将填充所有剩余的步骤):
1
$io->progressFinish ();
- progressIterate ()
-
如果进度条循环遍历可迭代集合,请使用
progressIterate ()
助手:1 2 3 4 5
$可迭代的= (1,2];foreach($io->progressIterate ($可迭代的)作为$价值) {/ /……做一些工作}
- createProgressBar ()
- 的实例ProgressBar根据Symfony风格指南设计。ob娱乐下载
用户输入法
- 问()
-
它要求用户提供一些值:
1
$io->问(“你叫什么名字?”);
你可以将默认值作为第二个参数传递,这样用户就可以按
键来选择该值: 1
$io->问(“你从哪里来?”,“美国”);
如果你需要验证给定的值,传递一个回调验证器作为第三个参数:
1 2 3 4 5 6 7
$io->问(“开工工人人数”,1,函数($数量){如果(!is_numeric ($数量)) {扔新\ RuntimeException (“你必须输入一个数字。”);}返回(int)$数量;});
- askHidden ()
-
这和
问()
方法,但用户的输入将被隐藏,并且它不能定义默认值。在询问敏感信息时使用:1
$io->askHidden (“你的密码是什么?”);
如果你需要验证给定的值,传递一个回调验证器作为第二个参数:
1 2 3 4 5 6 7
$io->askHidden (“你的密码是什么?”,函数($密码){如果(空($密码)) {扔新\ RuntimeException (“密码不能为空。”);}返回$密码;});
- 确认()
-
它向用户询问Yes/No问题,并且只返回
真正的
或假
:1
$io->确认(“重启网络服务器?”);
你可以将默认值作为第二个参数传递,这样用户就可以按
键来选择该值: 1
$io->确认(“重启网络服务器?”,真正的);
- 选择()
-
它提出一个问题,其答案受限于给定的有效答案列表:
1
$io->选择(“选择要分析的队列”, (“queue1”,“queue2”,“queue3”]);
你可以将默认值作为第三个参数传递,这样用户就可以按
键来选择该值: 1
$io->选择(“选择要分析的队列”, (“queue1”,“queue2”,“queue3”),“queue1”);
最后,您可以允许用户选择多个选项。要做到这一点,用户必须用逗号分隔每个选择(例如输入
1、2
将选择选项1和2):1
$io->选择(“选择要分析的队列”, (“queue1”,“queue2”,“queue3”多选):真正的);
6.2
的多选
选择选择()
在Symfony 6.2中引入。ob娱乐下载
结果的方法
请注意
如果你打印任何URL,它不会被破坏/切割,它将是可点击的-如果终端提供它。如果“格式良好的输出”更重要,你可以关闭它:
1
$io->getOutputWrapper ()->setAllowCutUrls (真正的);
- 成功()
-
它将显示给定的字符串或字符串数组,并将其突出显示为成功消息(带有绿色背景和
(好的)
标签)。它只用于显示执行给定命令的最终结果,但你可以在执行命令的过程中反复使用它:1 2 3 4 5 6 7 8 9 10
//使用简单的字符串获得简短的成功消息$io->成功(" Lorem ipsum dolor sit amet ");/ /……//当显示较长的成功消息时,考虑使用数组$io->成功([" Lorem ipsum dolor sit amet ",“圣贤”]);
- 信息()
-
这和
成功()
方法(给定的字符串或字符串数组以绿色背景显示),但是(好的)
标签没有前缀。它只用于显示执行给定命令的最终结果,而不显示成功或失败的结果:1 2 3 4 5 6 7 8 9 10
//为简短的信息消息使用简单的字符串$io->信息(" Lorem ipsum dolor sit amet ");/ /……//考虑在显示长信息消息时使用数组$io->信息([" Lorem ipsum dolor sit amet ",“圣贤”]);
- 警告()
-
它将显示给定的字符串或字符串数组,并突出显示为警告消息(带有红色背景和
(警告)
标签)。它只用于显示执行给定命令的最终结果,但你可以在执行命令的过程中反复使用它:1 2 3 4 5 6 7 8 9 10
//使用简单的字符串来表示简短的警告消息$io->警告(" Lorem ipsum dolor sit amet ");/ /……//当显示较长的警告消息时,考虑使用数组$io->警告([" Lorem ipsum dolor sit amet ",“圣贤”]);
- 错误()
-
它将显示给定的字符串或字符串数组,并突出显示为错误消息(带有红色背景和
(错误)
标签)。它只用于显示执行给定命令的最终结果,但你可以在执行命令的过程中反复使用它:1 2 3 4 5 6 7 8 9 10
//使用简单的字符串来表示简短的错误消息$io->错误(" Lorem ipsum dolor sit amet ");/ /……//当显示较长的错误消息时,考虑使用数组$io->错误([" Lorem ipsum dolor sit amet ",“圣贤”]);
配置默认样式
默认情况下,Symfonob娱乐下载y Styles包装所有内容,以避免文本行过长。唯一的例外是url,不管它们有多长,它们都不会被包装。这样做是为了在支持url的终端中启用可点击url。
如果你喜欢包装所有内容,包括url,使用这个方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /命令/ GreetCommand.php名称空间应用程序\命令;/ /……使用ob娱乐下载\组件\控制台\风格\ob娱乐下载SymfonyStyle;类GreetCommand扩展命令{/ /……受保护的函数执行(InputInterface$输入, OutputInterface$输出):int{$io=新ob娱乐下载SymfonyStyle ($输入,$输出);$io->getOutputWrapper ()->setAllowCutUrls (真正的);/ /……}}
6.2
的setAllowCutUrls ()
方法是在Symfony 6.2中引入的。ob娱乐下载
定义自己的风格
如果您不喜欢使用Symfony样式的命令的设计,您可以定义自己的控制台样式集。ob娱乐下载类的实现StyleInterface:
1 2 3 4 5 6 7 8
名称空间应用程序\控制台;使用ob娱乐下载\组件\控制台\风格\StyleInterface;类CustomStyle实现了StyleInterface{/ /……实现接口的方法}
然后,实例化这个自定义类而不是默认类ob娱乐下载SymfonyStyle
在你的命令里。多亏了StyleInterface
你不需要改变命令的代码来改变它们的外观:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src /命令/ GreetCommand.php名称空间应用程序\控制台;使用应用程序\控制台\CustomStyle;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;类GreetCommand扩展命令{/ /……受保护的函数执行(InputInterface$输入, OutputInterface$输出):int{/ /之前$io=新ob娱乐下载SymfonyStyle ($输入,$输出);/ /后$io=新CustomStyle ($输入,$输出);/ /……}}
写入错误输出
如果您重用某个命令的输出作为其他命令的输入,或者将其转储到一个文件中以供以后重用,那么您可能希望排除没有实际价值的进度条、注释和其他输出。
命令可以以两种不同的流输出信息:stdout
(标准输出)是真实内容应该输出的流stderr
(标准错误)是错误和调试消息应该输出的流。
的ob娱乐下载SymfonyStyle类提供了一个方便的方法getErrorStyle ()在两个流之间切换。此方法返回一个newob娱乐下载SymfonyStyle
实例,使用错误输出:
1 2 3 4 5 6 7
$io=新ob娱乐下载SymfonyStyle ($输入,$输出);//写入标准输出$io->写(“可重用的信息”);//写入错误输出$io->getErrorStyle ()->警告('调试信息或错误');
请注意
如果你创建一个ob娱乐下载SymfonyStyle
实例。OutputInterface
对象的实例ConsoleOutputInterface,getErrorStyle ()
方法将不起作用,返回的对象仍将写入标准输出,而不是写入错误输出。