如何设置控制台命令的样式

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何设置控制台命令的样式

创建控制台命令时最无聊的任务之一是处理命令输入和输出的样式。显示标题和表格或向用户询问问题涉及大量重复的代码。

例如,考虑用于显示以下命令标题的代码:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src /命令/ GreetCommand.php名称空间应用程序命令使用欧宝娱乐app下载地址组件控制台命令命令使用欧宝娱乐app下载地址组件控制台输入InputInterface使用欧宝娱乐app下载地址组件控制台输出OutputInterfaceGreetCommand扩展命令/ /……受保护的函数执行(InputInterface输入, OutputInterface输出:int输出->writeln (['Lorem Ipsum Dolor Sit met'' <信息 >==========================']);/ /……}}

显示一个简单的标题需要三行代码来更改字体颜色、下划线内容以及在标题后留下额外的空白行。设计良好的命令需要处理样式,但这会不必要地使代码复杂化。

为了减少样板代码,Symfony命令可以选择使用欧宝娱乐app下载地址欧宝娱乐app下载地址Symfony风格指南.这些样式被实现为一组帮助器方法,允许创建语义命令,忘记它们的样式。

基本用法

在命令中,实例化欧宝娱乐app下载地址SymfonyStyle类,并传递输入美元而且输出美元变量作为它的参数。然后,您可以开始使用它的任何帮助程序,例如标题(),显示命令的标题:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src /命令/ GreetCommand.php名称空间应用程序命令使用欧宝娱乐app下载地址组件控制台命令命令使用欧宝娱乐app下载地址组件控制台输入InputInterface使用欧宝娱乐app下载地址组件控制台输出OutputInterface使用欧宝娱乐app下载地址组件控制台风格欧宝娱乐app下载地址SymfonyStyleGreetCommand扩展命令/ /……受保护的函数执行(InputInterface输入, OutputInterface输出:intio欧宝娱乐app下载地址SymfonyStyle (输入输出);io->标题(" Lorem Ipsum Dolor Sit Amet ");/ /……}}

辅助方法

欧宝娱乐app下载地址SymfonyStyle类定义了一些帮助器方法,这些方法涵盖了控制台命令执行的最常见的交互。

烫金方法

标题()

它将给定的字符串显示为命令标题。这个方法在给定的命令中只能使用一次,但没有什么可以阻止你重复使用它:

1
io->标题(" Lorem ipsum dolor sit amet ");
(节)

它将给定的字符串显示为某些命令节的标题。这只需要在复杂的命令中更好地分离它们的内容:

1 2 3 4 5 6 7
io->部分(“添加用户”);/ /……io->部分(“生成密码”);/ /……

内容的方法

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”]);
换行符()

在命令回显中显示空行。虽然它看起来很有用,但大多数时候你根本不需要它。原因是每个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 ();

用户输入法

问()

它要求用户提供一些值:

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 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 "“圣贤”]);

5.2

信息()方法是在Symfony 5.2中引入的。欧宝娱乐app下载地址

警告()

它将显示给定的字符串或字符串数组,并突出显示为警告消息(带有红色背景和(警告)标签)。它只用于显示执行给定命令的最终结果,但你可以在执行命令的过程中反复使用它:

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 "“圣贤”]);

定义自己的风格

如果您不喜欢使用Symfony样式的命令的设计,您可以定义自己的控制台样式集。欧宝娱乐app下载地址类的实现StyleInterface:

1 2 3 4 5 6 7 8
名称空间应用程序控制台使用欧宝娱乐app下载地址组件控制台风格StyleInterfaceCustomStyle实现了StyleInterface/ /……实现接口的方法

然后,实例化这个自定义类而不是默认类欧宝娱乐app下载地址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使用欧宝娱乐app下载地址组件控制台命令命令使用欧宝娱乐app下载地址组件控制台输入InputInterface使用欧宝娱乐app下载地址组件控制台输出OutputInterfaceGreetCommand扩展命令/ /……受保护的函数执行(InputInterface输入, OutputInterface输出:int/ /之前io欧宝娱乐app下载地址SymfonyStyle (输入输出);/ /后ioCustomStyle (输入输出);/ /……}}

写入错误输出

如果您重用某个命令的输出作为其他命令的输入,或者将其转储到一个文件中以供以后重用,那么您可能希望排除没有实际价值的进度条、注释和其他输出。

命令可以以两种不同的流输出信息:stdout(标准输出)是真实内容应该输出的流stderr(标准错误)是错误和调试消息应该输出的流。

欧宝娱乐app下载地址SymfonyStyle类提供了一个方便的方法getErrorStyle ()在两个流之间切换。此方法返回一个new欧宝娱乐app下载地址SymfonyStyle实例,使用错误输出:

1 2 3 4 5 6 7
io欧宝娱乐app下载地址SymfonyStyle (输入输出);//写入标准输出io->写(“可重用的信息”);//写入错误输出io->getErrorStyle ()->警告('调试信息或错误');

请注意

如果你创建一个欧宝娱乐app下载地址SymfonyStyle实例。OutputInterface对象的实例ConsoleOutputInterface,getErrorStyle ()方法将不起作用,返回的对象仍将写入标准输出,而不是写入错误输出。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode