问题的助手
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.1,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
问题的助手
的QuestionHelper提供向用户询问更多信息的函数。它包含在默认帮助器集中,您可以通过调用它来获取getHelperSet ():
1
$助手=$这->getHelper (“问题”);
问题助手只有一个方法问()这需要一个InputInterface实例作为第一个参数,anOutputInterfaceInstance作为第二个参数,而a问题最后一个论点。
请求用户确认
假设您希望在实际执行某个操作之前确认该操作。在命令中添加以下内容:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ /……使用欧宝娱乐app下载地址\组件\控制台\命令\命令;使用欧宝娱乐app下载地址\组件\控制台\输入\InputInterface;使用欧宝娱乐app下载地址\组件\控制台\输出\OutputInterface;使用欧宝娱乐app下载地址\组件\控制台\问题\ConfirmationQuestion;类YourCommand扩展命令{/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){$助手=$这->getHelper (“问题”);$问题=新ConfirmationQuestion (“继续这一行动?”,假);如果(!$助手->问($输入,$输出,$问题)) {返回;}}}
在这种情况下,用户将被问到“继续此操作?”如果用户用y
它返回真正的
或假
如果他们回答n
.第二个参数__construct ()是用户未输入任何有效输入时返回的默认值。如果没有提供第二个参数,真正的
假定。
提示
您可以自定义正则表达式,用于在构造函数的第三个参数中检查答案是否为“yes”。例如,允许以任意一个开头的任何内容y
或j
,则设置为:
1 2 3 4 5
$问题=新ConfirmationQuestion (“继续这一行动?”,假,' / ^ (y | j) /我);
正则表达式默认为/ ^ y /我
.
向用户询问信息
你也可以问一个问题,而不是简单的是/否的答案。例如,如果你想知道一个bundle的名字,你可以把这个添加到你的命令中:
1 2 3 4 5 6 7 8 9 10
使用欧宝娱乐app下载地址\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){/ /……$问题=新问题(“请输入包裹名称”,“AcmeDemoBundle”);$bundleName=$助手->问($输入,$输出,$问题);}
用户将被要求“请输入捆绑包的名称”。方法返回的名称问()方法。如果将其保留为空,则默认值(AcmeDemoBundle
这里)返回。
让用户从答案列表中选择
如果您有一组预定义的答案供用户选择,您可以使用ChoiceQuestion确保用户只能从预定义的列表中输入有效的字符串:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用欧宝娱乐app下载地址\组件\控制台\问题\ChoiceQuestion;/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){/ /……$助手=$这->getHelper (“问题”);$问题=新ChoiceQuestion (请选择您最喜欢的颜色(默认为红色), (“红色”,“蓝”,“黄色”),0);$问题->setErrorMessage (“颜色%s无效。”);$颜色=$助手->问($输入,$输出,$问题);$输出->writeln (“您刚刚选择了:”.$颜色);/ /……改变一下颜色}
默认情况下应该选择的选项由构造函数的第三个参数提供。默认为零
,这意味着没有选项是默认选项。
如果用户输入了无效字符串,则会显示错误消息,并要求用户再次提供答案,直到他们输入有效字符串或达到最大尝试次数为止。最大尝试次数的缺省值为零
,这意味着无限次的尝试。可以使用。定义自己的错误消息setErrorMessage ().
多个选择
有时,可以给出多个答案。的ChoiceQuestion
使用逗号分隔值提供此功能。默认情况下是禁用的,以启用此使用setMultiselect ():
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用欧宝娱乐app下载地址\组件\控制台\问题\ChoiceQuestion;/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){/ /……$助手=$这->getHelper (“问题”);$问题=新ChoiceQuestion (“请选择您喜欢的颜色(默认为红色和蓝色)”, (“红色”,“蓝”,“黄色”),“0 1”);$问题->setMultiselect (真正的);$颜色=$助手->问($输入,$输出,$问题);$输出->writeln (“您刚刚选择了:”.内爆(”、“,$颜色));}
现在,当用户进入1、2
,结果为:你刚刚选择了:蓝色,黄色
.
如果用户不输入任何东西,结果将是:你刚刚选择了:红色,蓝色
.
自动完成
还可以为给定的问题指定潜在答案的数组。这些将在用户输入时自动补全:
12 3 4 5 6 7 8 9 10 11 12 13 14
使用欧宝娱乐app下载地址\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){/ /……$助手=$这->getHelper (“问题”);$包= (“AcmeDemoBundle”,“AcmeBlogBundle”,“AcmeStoreBundle”];$问题=新问题(“请输入一个包的名称”,“FooBundle”);$问题->setAutocompleterValues ($包);$bundleName=$助手->问($输入,$输出,$问题);}
隐藏用户的响应
你也可以问一个问题,然后隐藏答案。这对于密码来说特别方便:
12 3 4 5 6 7 8 9 10 11 12 13 14
使用欧宝娱乐app下载地址\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){/ /……$助手=$这->getHelper (“问题”);$问题=新问题(“数据库密码是什么?”);$问题->setHidden (真正的);$问题->setHiddenFallback (假);$密码=$助手->问($输入,$输出,$问题);}
谨慎
当您请求隐藏响应时,Symfony将使用二进制文件、更改stty模式或使欧宝娱乐app下载地址用其他技巧来隐藏响应。如果没有可用的,它将回退并允许响应可见,除非您将此行为设置为假
使用setHiddenFallback ()就像上面的例子一样。在本例中,aRuntimeException
会被扔出去。
请注意
的stty
命令用于获取和设置命令行属性(如获取行数和列数或隐藏输入文本)。在Windows系统上,这个stty
命令可能会产生杂乱的输出并破坏输入文本。如果这是你的情况,用下面的命令禁用它:
12 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址\组件\控制台\助手\QuestionHelper;使用欧宝娱乐app下载地址\组件\控制台\问题\ChoiceQuestion;/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){/ /……$助手=$这->getHelper (“问题”);QuestionHelper::disableStty ();/ /……}
标准化答案
在验证答案之前,您可以将其“规范化”以修复小错误或根据需要调整它。例如,在前面的示例中,您要求提供bundle名称。如果用户错误地在名称周围添加了空格,您可以在验证之前修改名称。方法配置规范化器setNormalizer ()方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){/ /……$助手=$这->getHelper (“问题”);$问题=新问题(“请输入包裹名称”,“AcmeDemoBundle”);$问题->setNormalizer (函数($价值){// $value可以为空返回$价值?削减($价值):”;});$bundleName=$助手->问($输入,$输出,$问题);}
谨慎
首先调用规范化器,并将返回值用作验证器的输入。如果答案无效,不要在规范化器中抛出异常,让验证器处理这些错误。
验证答案
你甚至可以验证答案。例如,在前面的示例中,您要求提供bundle名称。按照Symfony命名约定,欧宝娱乐app下载地址它的后缀应该是包
.方法进行验证setValidator ()方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
使用欧宝娱乐app下载地址\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){/ /……$助手=$这->getHelper (“问题”);$问题=新问题(“请输入包裹名称”,“AcmeDemoBundle”);$问题->setValidator (函数($回答){如果(!is_string ($回答) | |“包”! = = substr ($回答,6)) {扔新\ RuntimeException (bundle名称的后缀应该是\' bundle \ ");}返回$回答;});$问题->setMaxAttempts (2);$bundleName=$助手->问($输入,$输出,$问题);}
的美元的验证器
处理验证的回调。如果有错误,它应该抛出异常。异常消息显示在控制台中,因此最好在其中放置一些有用的信息。如果验证成功,回调函数还应该返回用户输入的值。
属性可以设置要询问的最大次数setMaxAttempts ()方法。如果你达到这个最大值,它将使用默认值。使用零
意味着尝试次数是无限的。只要用户提供了无效的答案,就会被询问,只有当他们的输入有效时才能继续。
验证隐藏响应
你也可以使用带有隐藏问题的验证器:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
使用欧宝娱乐app下载地址\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface$输入, OutputInterface$输出){/ /……$助手=$这->getHelper (“问题”);$问题=新问题(“请输入密码”);$问题->setValidator (函数($价值){如果(修剪($价值) = =”) {扔新\异常(“密码不能为空”);}返回$价值;});$问题->setHidden (真正的);$问题->setMaxAttempts (20.);$密码=$助手->问($输入,$输出,$问题);}
测试需要输入的命令
如果你想为一个命令编写单元测试,该命令期望从命令行输入某种类型的输入,你需要设置命令期望的输入:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
使用欧宝娱乐app下载地址\组件\控制台\助手\QuestionHelper;使用欧宝娱乐app下载地址\组件\控制台\助手\HelperSet;使用欧宝娱乐app下载地址\组件\控制台\测试人员\CommandTester;/ /……公共函数testExecute(){/ /……$commandTester=新CommandTester ($命令);//等于用户输入“Test”并按回车键$commandTester->setInputs ([“测试”]);//等于用户输入“This”,“That”,然后按ENTER//这可以用来回答两个独立的问题$commandTester->setInputs ([“这”,“,”]);//为了模拟确认问题的肯定答案,添加一个//额外的输入说“是”将工作$commandTester->setInputs ([“是的”]);$commandTester->执行([“命令”= >$命令->getName ()));/ / $ this - > assertRegExp(' /…/ ', commandTester - > getDisplay ());}
通过调用setInputs (),您可以模拟控制台通过CLI对所有用户输入在内部所做的工作。该方法只接受一个数组作为参数,对于命令所期望的每个输入,使用一个表示用户将要输入内容的字符串。通过这种方式,您可以通过传递适当的输入来测试任何用户交互(甚至是复杂的交互)。
请注意
的CommandTester自动模拟用户击球输入
在每次输入之后,不需要传递额外的输入。
谨慎
在Windows系统上,Symfony欧宝娱乐app下载地址使用一个特殊的二进制文件来实现隐藏的问题。这意味着这些问题不使用默认值输入
控制台对象,因此你不能在Windows上测试它们。