控制台输入(参数和选项)
编辑本页控制台输入(参数和选项)
命令中最有趣的部分是可以使用的参数和选项。这些参数和选项允许您从终端向命令传递动态信息。
使用命令参数
参数是命令名称本身后面的字符串(由空格分隔)。它们是有序的,可以是可选的,也可以是必需的。例如,添加一个可选选项last_name
参数,并使的名字
参数要求:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ /……使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputArgument;类GreetCommand扩展命令{/ /……受保护的函数配置():无效{$这/ /……->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娱乐下载\组件\控制台\输出\OutputInterface;类GreetCommand扩展命令{/ /……受保护的函数执行(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=5$php 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
),但短选项只能使用空格或不使用分隔符(例如:我5
或i5
).
谨慎
虽然可以使用空格将选项与其值分开,但如果选项出现在命令名之前,则使用这种形式会导致歧义。例如,php bin/console——迭代5应用程序:问候Fabien
是模糊的;ob娱乐下载Symfony会解释5
作为命令名。要避免这种情况,请始终将选项放在命令名之后,或者避免使用空格将选项名与其值分隔开。
你可以使用五个选项变体:
-
InputOption: VALUE_IS_ARRAY
-
该选项接受多个值(例如:
- - - dir = / foo - dir = /酒吧
); -
InputOption: VALUE_NONE
-
不接受此选项的输入(例如:
——大喊
).返回的值是布尔值(假
如果没有提供该选项)。这是选项的默认行为; -
InputOption: VALUE_REQUIRED
-
这个值是必需的(例如:
——迭代= 5
或i5
),该选项本身仍然是可选的; -
InputOption: VALUE_OPTIONAL
-
这个选项可能有值,也可能没有值(例如:
——大喊
或——大声喊=
). -
InputOption: VALUE_NEGATABLE
-
接受任何一个标志(例如:
——大喊
)或其否定(例如:——no-yell
).
5.3
的InputOption: VALUE_NEGATABLE
常量是在Symfony 5.3中引入的。ob娱乐下载
你需要结合VALUE_IS_ARRAY
与VALUE_REQUIRED
或VALUE_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娱乐下载\组件\控制台\完成\CompletionSuggestions;类GreetCommand扩展命令{/ /……公共函数完整的(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 ([“法”,“法布里斯”),$建议);}}