问题的助手

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐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下载地址组件控制台问题ConfirmationQuestionYourCommand扩展命令/ /……公共函数执行(InputInterface输入, OutputInterface输出助手->getHelper (“问题”);问题ConfirmationQuestion (“继续这一行动?”);如果(!助手->问(输入输出问题)) {返回;}}}

在这种情况下,用户将被问到“继续此操作?”如果用户用y它返回真正的如果他们回答n.第二个参数__construct ()是用户未输入任何有效输入时返回的默认值。如果没有提供第二个参数,真正的假定。

提示

您可以自定义正则表达式,用于在构造函数的第三个参数中检查答案是否为“yes”。例如,允许以任意一个开头的任何内容yj,则设置为:

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()/ /……commandTesterCommandTester (命令);//等于用户输入“Test”并按回车键commandTester->setInputs ([“测试”]);//等于用户输入“This”,“That”,然后按ENTER//这可以用来回答两个独立的问题commandTester->setInputs ([“这”“,”]);//为了模拟确认问题的肯定答案,添加一个//额外的输入说“是”将工作commandTester->setInputs ([“是的”]);commandTester->执行([“命令”= >命令->getName ()));/ / $ this - > assertRegExp(' /…/ ', commandTester - > getDisplay ());

通过调用setInputs (),您可以模拟控制台通过CLI对所有用户输入在内部所做的工作。该方法只接受一个数组作为参数,对于命令所期望的每个输入,使用一个表示用户将要输入内容的字符串。通过这种方式,您可以通过传递适当的输入来测试任何用户交互(甚至是复杂的交互)。

请注意

CommandTester自动模拟用户击球输入在每次输入之后,不需要传递额外的输入。

谨慎

在Windows系统上,Symfony欧宝娱乐app下载地址使用一个特殊的二进制文件来实现隐藏的问题。这意味着这些问题不使用默认值输入控制台对象,因此你不能在Windows上测试它们。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。