问题的助手
编辑该页面问题的助手
的QuestionHelper提供功能要求用户的更多信息。它包含在默认辅助设置,你可以通过调用getHelper ():
1
美元助手=美元这- >getHelper (“问题”);
助手,只有一个方法的问题问()这需要一个InputInterface实例作为第一个参数,一个OutputInterface第二个参数和实例问题作为最后一个参数。
要求用户确认
假设你想确认操作之前执行它。添加以下命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ /……使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;使用ob娱乐下载\组件\控制台\问题\ConfirmationQuestion;类YourCommand扩展命令{/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{美元助手=美元这- >getHelper (“问题”);美元问题=新ConfirmationQuestion (“继续这个动作吗?”,假);如果(!美元助手- >问(美元输入,美元输出,美元问题)){返回命令::成功;}/ /……做一些在这里返回命令::成功;}}
在这种情况下,用户将被要求继续这个行动?。如果用户的答案y
它返回真正的
或假
如果他们回答n
。第二个参数__construct ()是返回的默认值,如果用户没有输入任何有效的输入。如果第二个参数是不提供的,真正的
假定。
提示
您可以自定义正则表达式用来检查如果答案是“是”的第三个参数的构造函数。例如,允许任何开始y
或j
,你会将它设置为:
1 2 3 4 5
美元问题=新ConfirmationQuestion (“继续这个动作吗?”,假,' / ^ (y | j) /我);
正则表达式默认为/ ^ y /我
。
要求用户信息
你也可以问一个问题,超过一个简单的是或否的答案。例如,如果你想知道一个包的名字,你可以将它添加到你的命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元问题=新问题(“请输入包名称”,“AcmeDemoBundle”);美元bundleName=美元助手- >问(美元输入,美元输出,美元问题);/ /……bundleName做些什么返回命令::成功;}
用户将被要求“请输入包名称”。他们可以将返回的输入一些名字问()方法。如果他们把它空,默认值(AcmeDemoBundle
返回)。
让用户从列表中选择的答案
如果你有一组预定义的回答用户可以选择,你可以使用ChoiceQuestion确保用户只能输入一个有效的字符串从预定义列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
使用ob娱乐下载\组件\控制台\问题\ChoiceQuestion;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);美元问题=新ChoiceQuestion (“请选择你最喜欢的颜色(默认为红色),/ /选择也可以实现__toString的PHP对象()方法(“红色”,“蓝”,“黄色”),0);美元问题- >setErrorMessage (颜色%年代是无效的。);美元颜色=美元助手- >问(美元输入,美元输出,美元问题);美元输出- >writeln (你只有选择:。美元颜色);/ /……做一些颜色吗返回命令::成功;}
应该是默认选中的选项提供的第三个参数的构造函数。默认值是零
,这意味着没有选项是默认的。
如果用户输入一个无效的字符串,显示一个错误消息和用户要求提供答案还有一次,直到他们输入有效的字符串或达到的最大数量。尝试的最大数量的默认值零
,这意味着无限的尝试。你可以定义自己的错误消息setErrorMessage ()。
多个选择
有时候,可以将多个答案。的ChoiceQuestion
使用逗号分隔值提供了这个功能。这是禁用默认情况下,启用此用setMultiselect ():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用ob娱乐下载\组件\控制台\问题\ChoiceQuestion;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);美元问题=新ChoiceQuestion (“请选择你喜欢的颜色(默认为红色和蓝色),(“红色”,“蓝”,“黄色”),“0 1”);美元问题- >setMultiselect (真正的);美元颜色=美元助手- >问(美元输入,美元输出,美元问题);美元输出- >writeln (你只有选择:。内爆(”、“,美元颜色));返回命令::成功;}
现在,当用户输入1、2
结果将是:你刚刚选择:蓝色、黄色
。
如果用户不输入任何东西,结果将是:你刚刚选择:红、蓝
。
自动完成
您还可以指定数组的潜在回答了对于一个给定的问题。这些将自动完成用户类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用ob娱乐下载\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);美元包= (“AcmeDemoBundle”,“AcmeBlogBundle”,“AcmeStoreBundle”];美元问题=新问题(“请输入一个包的名字”,“FooBundle”);美元问题- >setAutocompleterValues (美元包);美元bundleName=美元助手- >问(美元输入,美元输出,美元问题);/ /……bundleName做些什么返回命令::成功;}
在更复杂的用例,可能需要动态生成的建议,例如如果您希望自动完成文件路径。在这种情况下,您可以提供一个回调函数来动态生成的建议:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34
使用ob娱乐下载\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{美元助手=美元这- >getHelper (“问题”);/ /这个函数被调用时输入和新变化/ /建议是必要的。美元回调=函数(字符串美元userInput):数组{/ /去最后一个斜杠中的任何字符的字符串的结束/ /只保留最后一个目录和生成的建议美元inputPath= preg_replace (' % (/ | ^)[^ /]* $ % ',“1美元”,美元userInput);美元inputPath=”= = =美元inputPath吗?“。”:美元inputPath;/ /谨慎——这个示例代码允许无限制的访问/ /整个文件系统。在真实的应用程序中,限制的目录/ /文件和dirs可以找到的地方美元foundFilesAndDirs= @scandir (美元inputPath)?:[];返回到函数(字符串美元dirOrFile)使用(美元inputPath):字符串{返回美元inputPath。美元dirOrFile;},美元foundFilesAndDirs);};美元问题=新问题(“请提供文件的完整路径解析”);美元问题- >setAutocompleterCallback (美元回调);美元filePath=美元助手- >问(美元输入,美元输出,美元问题);/ /……filePath做些什么返回命令::成功;}
答案不修剪
您还可以指定如果你想直接不修剪答案通过设置setTrimmable ():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用ob娱乐下载\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);美元问题=新问题(“孩子的名字是什么?”);美元问题- >setTrimmable (假);/ /如果用户输入“埃尔莎”不修剪,你会得到“埃尔莎”价值美元的名字=美元助手- >问(美元输入,美元输出,美元问题);/ /……做某事的名字吗返回命令::成功;}
接受多行答案
默认情况下,这个问题辅助停止阅读用户输入时收到一个换行符(即。,当用户点击输入
一次)。不过,您可以指定响应问题应该允许多行答案通过真正的
来setMultiline ():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用ob娱乐下载\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);美元问题=新问题(“你如何解决世界和平?”);美元问题- >setMultiline (真正的);美元回答=美元助手- >问(美元输入,美元输出,美元问题);/ /……做一些与答案吗返回命令::成功;}
收到一个传输结束后多行问题停止阅读用户输入控制字符(ctrl - d
在Unix系统中或ctrl - z
在Windows上)。
隐藏用户的响应
你也可以问一个问题和隐藏的响应。这是特别方便的密码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用ob娱乐下载\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);美元问题=新问题(“什么是数据库密码?”);美元问题- >setHidden (真正的);美元问题- >setHiddenFallback (假);美元密码=美元助手- >问(美元输入,美元输出,美元问题);/ /……做一些与密码返回命令::成功;}
谨慎
当你问一个隐藏的回应,Symfony会使用二进制,改变ob娱乐下载stty
模式或使用另一个隐藏的响应。如果没有,它将回退和允许的响应是可见的,除非你设置这个行为假
使用setHiddenFallback ()就像在上面的例子中。在这种情况下,RuntimeException
会抛出。
请注意
的stty
命令用于获取和设置属性的命令行(如行和列的数量或隐藏输入文本)。在Windows系统上,这个stty
命令可以生成胡言乱语输出输入文本和变形。如果这是你的情况下,禁用它使用这个命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\控制台\助手\QuestionHelper;使用ob娱乐下载\组件\控制台\问题\ChoiceQuestion;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);QuestionHelper::disableStty ();/ /……返回命令::成功;}
正常化的答案
验证答案之前,你可以修复“正常化”小错误或根据需要调整它。例如,在前面的例子你要包名称。以防误周围的用户添加空白的名字,你可以修剪在验证之前的名字。为此,配置标准化者使用setNormalizer ()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
使用ob娱乐下载\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);美元问题=新问题(“请输入包名称”,“AcmeDemoBundle”);美元问题- >setNormalizer (函数(字符串美元价值):字符串{/ /美元值可以为空返回美元价值吗?削减(美元价值):”;});美元bundleName=美元助手- >问(美元输入,美元输出,美元问题);/ /……bundleName做些什么返回命令::成功;}
谨慎
标准化者称为第一和返回的值用作输入验证器。如果答案是无效的,不抛出异常的标准化者,让验证器处理这些错误。
验证答案
你甚至可以验证答案。例如,在前面的例子你要包名称。Symfony的命名约定后,ob娱乐下载应该后缀为包
。你可以验证通过setValidator ()方法:
1 2 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娱乐下载\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);美元问题=新问题(“请输入包名称”,“AcmeDemoBundle”);美元问题- >setValidator (函数(字符串美元回答):字符串{如果(! is_string (美元回答)| |“包”! = = substr (美元回答,6)){扔新\ RuntimeException (的包的名称应该后缀为\ '包\”);}返回美元回答;});美元问题- >setMaxAttempts (2);美元bundleName=美元助手- >问(美元输入,美元输出,美元问题);/ /……bundleName做些什么返回命令::成功;}
的美元的验证器
是一个回调处理验证。它应该抛出一个异常是否有错了。异常消息显示在控制台中,所以这是一个很好的实践,把一些有用的信息。回调函数也应该返回用户输入的值如果验证成功。
你可以设置的最大次数要求setMaxAttempts ()方法。如果你达到这个最大数量它将使用默认值。使用零
意味着尝试的数量是无限的。用户将被要求,只要他们提供了一个无效的答案,只能继续如果他们的输入是有效的。
提示
你甚至可以使用验证器通过使用组件来验证输入createCallable ()方法:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\验证器\约束\正则表达式;使用ob娱乐下载\组件\验证器\验证;美元问题=新问题(“请输入包名称”,“AcmeDemoBundle”);美元验证=验证::createCallable (新正则表达式([“模式”= >' / ^ [a-zA-Z] +包$ / ',“消息”= >的包的名称应该后缀为\ '包\”)));美元问题- >setValidator (美元验证);
验证一个隐藏的响应
您还可以使用一个验证器和一个隐藏的问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27日28
使用ob娱乐下载\组件\控制台\问题\问题;/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元助手=美元这- >getHelper (“问题”);美元问题=新问题(“请输入密码”);美元问题- >setNormalizer (函数字符串(?美元价值):字符串{返回美元价值吗?吗?”;});美元问题- >setValidator (函数(字符串美元价值):字符串{如果(”= = =修剪(美元价值)){扔新\异常(密码不能是空的);}返回美元价值;});美元问题- >setHidden (真正的);美元问题- >setMaxAttempts (20.);美元密码=美元助手- >问(美元输入,美元输出,美元问题);/ /……做一些与密码返回命令::成功;}
预计输入测试命令
如果你想编写一个单元测试的命令预计从命令行输入,您需要设置输入命令预计:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
使用ob娱乐下载\组件\控制台\测试人员\CommandTester;/ /……公共函数testExecute():无效{/ /……美元commandTester=新CommandTester (美元命令);/ /等于用户输入“测试”和输入美元commandTester- >setInputs ([“测试”]);/ / =用户输入“这”、“那”和输入/ /这可以用于回答两个分离的问题美元commandTester- >setInputs ([“这”,“,”]);/ /模拟一个肯定的答复确认问题,添加一个/ /额外的输入说“是的”美元commandTester- >setInputs ([“是的”]);美元commandTester- >执行([“命令”= >美元命令- >getName ()));/ / $ this - > assertRegExp (' /…/ ',$ commandTester - > getDisplay ());}
通过调用setInputs (),你模仿控制台内部与所有用户输入CLI。这个方法只以数组为参数,对每个输入命令预计,代表用户会输入字符串。这样你可以测试任何用户交互(即使是复杂的)通过适当的输入。
请注意
的CommandTester自动模拟用户打输入
每个输入后,不需要通过一个额外的输入。
谨慎
在Windows系统上Symfony使ob娱乐下载用一个特殊的二进制来实现隐藏的问题。这意味着这些问题不要使用默认的输入
控制台对象,因此你不能在Windows测试它们。