控制台输入(参数和选项)

编辑本页

控制台输入(参数和选项)

命令中最有趣的部分是可以使用的参数和选项。这些参数和选项允许您从终端向命令传递动态信息。

使用命令参数

参数是命令名称本身后面的字符串(由空格分隔)。它们是有序的,可以是可选的,也可以是必需的。例如,添加一个可选选项last_name参数,并使的名字参数要求:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ /……使用ob娱乐下载组件控制台命令命令使用ob娱乐下载组件控制台输入InputArgumentGreetCommand扩展命令/ /……受保护的函数配置()无效/ /……->addArgument (“名字”, InputArgument::必需的,“你想和谁打招呼?”->addArgument (“last_name”, InputArgument::可选的,“你姓什么?”);}}

您现在可以访问alast_name命令中的参数:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ /……使用ob娱乐下载组件控制台命令命令使用ob娱乐下载组件控制台输入InputInterface使用ob娱乐下载组件控制台输出OutputInterfaceGreetCommand扩展命令/ /……受保护的函数执行(InputInterface输入, OutputInterface输出int文本“嗨”输入->getArgument (“名字”);输入->getArgument (“last_name”);如果) {文本=。' ';}输出->writeln (文本“!”);返回命令::成功;}}

该命令现在可以以以下两种方式使用:

1 2 3 4 5
php bin/控制台应用程序:你好Fabien!你好Fabien Potencier!

也可以让一个参数接受一个值列表(假设你想问候你所有的朋友)。只有最后一个参数可以是一个列表:

1 2 3 4 5 6 7 8
/ /……->addArgument (“名字”, InputArgument::IS_ARRAY,“你想和谁打招呼(多个名字用空格隔开)?”);

要使用它,请指定尽可能多的名称:

1
php bin/控制台应用程序:欢迎Fabien Ryan Bernhard

您可以访问的名字参数作为数组:

1 2 3 4
的名字输入->getArgument (“名字”);如果(数(的名字) >0) {文本=。' '.implode (”、“的名字);}

你可以使用三种参数变体:

InputArgument:需要
这个论证是强制性的。如果没有提供参数,命令不会运行;
InputArgument::可选
参数是可选的,因此可以省略。这是参数的默认行为;
InputArgument: IS_ARRAY
参数可以包含任意数量的值。因此,它必须用于参数列表的末尾。

你可以结合IS_ARRAY要求可选是这样的:

1 2 3 4 5 6 7 8
/ /……->addArgument (“名字”, InputArgument::IS_ARRAY |输入数据::必需的,“你想和谁打招呼(多个名字用空格隔开)?”);

使用命令选项

与参数不同,选项是没有顺序的(这意味着您可以以任何顺序指定它们),并且用两个破折号指定(例如。——大喊).选项是总是可选的,可以设置为接受一个值(例如。- - - dir = src)或作为一个布尔标志而不带值(例如:——大喊).

例如,在命令中添加一个新选项,用于指定消息在一行中应该打印多少次:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ /……使用ob娱乐下载组件控制台输入InputOption/ /……->使用addOption (//这是用户必须输入的名称来传递该选项(例如——iterations=5)“迭代”//这是选项名称的可选快捷方式,通常只是一个字母/ /(如。' i ',所以用户传递它为' -i ');在常用选项中使用它//或具有长名称的选项//这是选项的类型(例如,需要一个值,可以传递多次,等等)InputOption::VALUE_REQUIRED,//显示命令帮助时显示的选项描述“这条信息应该打印几次?”//选项的默认值(对于那些允许传递值的选项)1);

接下来,在命令中使用this多次打印消息:

1 2 3
0<输入->getOption (“迭代”);+ +) {输出->writeln (文本);}

现在,当您运行该命令时,您可以选择指定——迭代国旗:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
# no——提供的迭代,使用默认值(1)php bin/控制台应用程序:你好Fabien!php bin/console app:greet Fabien—iterations=5 Hi Fabien!你好,法比安!你好,法比安!你好,法比安!你好,法比安!选项的顺序并不重要php bin/控制台应用程序:问候Fabien—迭代=5—大喊php bin/控制台应用程序:greet Fabien—yell—iterations=5php bin/console app:greet——yell——iterations=5 Fabien . php bin/console app:greet——yell——iterations=5 Fabien . php

提示

您还可以声明一个单字母的快捷方式,可以用一个破折号调用,例如-我

1 2 3 4 5 6 7 8 9 10
/ /……->使用addOption (“迭代”“我”, InputOption::VALUE_REQUIRED,“这条信息应该打印几次?”1);

注意,要遵守docopt标准,则长选项可以在空格或(如迹象。——迭代5——迭代= 5),但短选项只能使用空格或不使用分隔符(例如:我5i5).

谨慎

虽然可以使用空格将选项与其值分开,但如果选项出现在命令名之前,则使用这种形式会导致歧义。例如,php bin/console——迭代5应用程序:问候Fabien是模糊的;ob娱乐下载Symfony会解释5作为命令名。要避免这种情况,请始终将选项放在命令名之后,或者避免使用空格将选项名与其值分隔开。

你可以使用五个选项变体:

InputOption: VALUE_IS_ARRAY
该选项接受多个值(例如:- - - dir = / foo - dir = /酒吧);
InputOption: VALUE_NONE
不接受此选项的输入(例如:——大喊).返回的值是布尔值(如果没有提供该选项)。这是选项的默认行为;
InputOption: VALUE_REQUIRED
这个值是必需的(例如:——迭代= 5i5),该选项本身仍然是可选的;
InputOption: VALUE_OPTIONAL
这个选项可能有值,也可能没有值(例如:——大喊——大声喊=).
InputOption: VALUE_NEGATABLE
接受任何一个标志(例如:——大喊)或其否定(例如:——no-yell).

5.3

InputOption: VALUE_NEGATABLE常量是在Symfony 5.3中引入的。ob娱乐下载

你需要结合VALUE_IS_ARRAYVALUE_REQUIREDVALUE_OPTIONAL是这样的:

1 2 3 4 5 6 7 8 9 10
/ /……->使用addOption (“颜色”, InputOption::VALUE_REQUIRED |输入::VALUE_IS_ARRAY,“你喜欢什么颜色?”, (“蓝”“红色”]);

带有可选参数的选项

没有什么禁止您创建带有可选接受值的选项的命令,但这有点棘手。想想这个例子:

12 3 4 5 6 7 8 9 10 11 12
/ /……使用ob娱乐下载组件控制台输入InputOption/ /……->使用addOption (“喊”, InputOption::VALUE_OPTIONAL,“我应该在打招呼的时候大喊吗?”);

这个选项可以通过3种方式使用:问候,大喊问候——大喊=响亮,问候.然而,很难区分传递不带值的选项(问候,大喊),而不传递选项(问候).

要解决此问题,必须将该选项的默认值设置为

12 3 4 5 6 7 8 9 10 11 12 13
/ /……使用ob娱乐下载组件控制台输入InputOption/ /……->使用addOption (“喊”, InputOption::VALUE_OPTIONAL,“我应该在打招呼的时候大喊吗?”//这是新的默认值,而不是null);

现在可以区分不传递选项和不传递它的任何值:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
用optionValue输入->getOption (“喊”);如果===用optionValue) {//在这种情况下,运行命令时不传递该选项大喊yellLouder;}elseif===用optionValue) {//在这种情况下,该选项在运行命令时被传递//但是没有给它赋值大喊真正的yellLouder;}其他的//在这种情况下,该选项在运行命令和时被传递//给它一个特定的值大喊真正的如果“声音”===用optionValue) {yellLouder真正的;}其他的yellLouder;}}

上面的代码可以简化如下,因为False !== null

1 2 3
用optionValue输入->getOption (“喊”);大喊= (用optionValue= = !);yellLouder= (用optionValue===“声音”);

添加参数/选项值完成

5.4

Symfony 5.4中引入了控制台补全功能。ob娱乐下载

如果安装控制台完成,命令和选项名称将由shell自动完成。但是,您也可以为命令中的输入实现值补全。的数据库中填写所有用户名的名字你的问候命令的参数。

要实现此目标,请重写完成()方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/ /……使用ob娱乐下载组件控制台完成CompletionInput使用ob娱乐下载组件控制台完成CompletionSuggestionsGreetCommand扩展命令/ /……公共函数完整的(CompletionInput输入, CompletionSuggestions建议无效如果输入->mustSuggestArgumentValuesFor (“名字”)) {//用户要求为"names"选项输入补全//用户已经输入的值,例如在输入"app:greet Fa"之前//按Tab键,将包含"Fa"currentValue输入->getCompletionValue ();//从某个地方获取用户名列表(例如数据库)//您可以使用$currentValue来过滤名称availableUsernames=……;//然后将检索到的名称作为建议值添加建议->suggestValues (availableUsernames);}}}

这就是你所需要的!假设用户“Fabien”和“Fabrice”存在,输入后按tab键应用:问候足总我会给你这些名字作为建议。

提示

bash shell能够处理大量的建议,并将根据用户的现有输入自动过滤建议值。您不必在命令中实现任何筛选逻辑。

你可以使用CompletionInput: getCompletionValue ()获取当前输入,如果这有助于提高性能(例如,通过减少从数据库中获取的行数)。

测试完成脚本

Console组件有一个特殊功能CommandCompletionTester类来帮助你单元测试完成逻辑:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ /……使用ob娱乐下载组件控制台应用程序GreetCommandTest扩展TestCase公共函数testComplete()应用程序应用程序();应用程序->add (GreetCommand ());//使用greet命令创建一个新的测试器测试人员CommandCompletionTester (应用程序->get (应用:问候的));//在没有任何现有输入的情况下完成输入(空字符串表示//光标的位置)建议测试人员->完成(['']);->assertSame ([“法”“法布里斯”“Wouter”),建议);//以"Fa"作为输入完成输入建议测试人员->完成([“足”]);->assertSame ([“法”“法布里斯”),建议);}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 5.4支持通过私人Packagist