控制台命令

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

控制台命令

Symfob娱乐下载ony框架提供了通过大量的命令bin /控制台脚本(如著名的bin /控制台缓存:清楚命令)。这些命令创建控制台组件。您还可以使用它来创建你自己的命令。

控制台:APP_ENV & APP_DEBUG

控制台命令的运行环境中定义的APP_ENV变量的.env文件,这是dev默认情况下。它还读取APP_DEBUG打开或关闭“调试”模式的价值(它默认1,)。

在另一个环境中运行该命令或调试模式,编辑的价值APP_ENVAPP_DEBUG

创建一个命令

命令扩展中定义的类命令。例如,您可能想要一个命令来创建一个用户:

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
/ / src /命令/ CreateUserCommand.php名称空间应用程序\命令;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;CreateUserCommand扩展命令{/ /命令的名称(“bin /控制台”后的部分)受保护的静态美元defaultName=“应用程序:创建用户”;受保护的函数配置():无效{/ /……}受保护的函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……把这里的代码来创建用户/ /这个方法必须返回一个整数“退出状态码”/ /命令。/ /返回这个问题如果没有运行命令返回0;/ /或返回执行期间如果发生了一些错误/ /返回1;}}

配置命令

您可以定义一个描述、消息和帮助输入选项和参数:

1 2 3 4 5 6 7 8 9 10 11 12
/ /……受保护的函数配置():无效{美元/ /显示的简短描述在运行“php bin /控制台名单”- >setDescription (创建一个新用户。)/ /运行命令时显示的完整命令的描述/ /”——帮助”选项- >setHelp (“这个命令允许您创建一个用户……”);}

配置()方法被调用结束时自动命令构造函数。如果你的命令定义自己的构造函数,设置属性,然后调用父构造函数,使这些属性中可用配置()方法:

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娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputArgument;CreateUserCommand扩展命令{/ /……公共函数__construct(保龄球美元requirePassword= false){/ /最佳实践建议先构造函数调用父/ /设置你自己的属性。在这种情况下,不工作/ /因为配置()需要这个构造函数的属性设置美元- >requirePassword =美元requirePassword;::__construct ();}受保护的函数配置():无效{美元/ /……- >addArgument (“密码”,美元- >requirePassword吗?InputArgument::要求:InputArgument::可选的,“用户密码”);}}

注册命令

ob娱乐下载必须注册为服务和Symfony命令标记console.command标签。如果你使用默认的服务。yaml的配置,这已经为你做好了,谢谢自动配置

执行命令

配置和注册命令后,您可以运行在终端:

1
美元php bin /控制台应用程序:创建用户

如您所料,这个命令将什么都不做你没有写任何逻辑。在添加自己的逻辑execute ()方法。

控制台输出

execute ()方法获得输出流写入消息到控制台:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ /……受保护的函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /多行输出到控制台(添加“\ n”结束时,每一行)美元输出- >writeln ([“用户的创造者”,' = = = = = = = = = = = = ',]);/ /返回的值someMethod()可以是一个迭代器(https://php.net/iterator)/ /生成并返回的消息“产量”PHP关键字美元输出- >writeln (美元- >someMethod ());/ /输出消息紧随其后的是“\ n”美元输出- >writeln (“哇!”);/ /输出一条消息没有添加一个“\ n”的路线美元输出- >写(你要的);美元输出- >写(创建一个用户。);返回0;}

现在,尝试执行命令:

1 2 3 4 5 6
美元php bin /控制台应用程序:创建用户用户创造者= = = = = = = = = = = =哇!你要创建一个用户。

输出部分

常规的控制台输出可分为多个独立区域称为“产出部分”。创建一个或更多的这些部分当你需要清晰和覆盖信息的输出。

部分是与创建的ConsoleOutput:部分()方法,该方法返回的一个实例ConsoleSectionOutput:

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娱乐下载\组件\控制台\输出\ConsoleOutputInterface;MyCommand扩展命令{受保护的函数执行(InputInterface美元输入,OutputInterface美元输出):int{如果(!美元输出运算符ConsoleOutputInterface) {\ LogicException (“这个命令只接受“ConsoleOutputInterface”的一个实例。);}美元section1=美元输出- >节();美元section2=美元输出- >节();美元section1- >writeln (“你好”);美元section2- >writeln (“世界!”);/ /输出显示“Hello \ nWorld ! \ n”/ /覆盖()替代所有现有的部分内容与给定的内容美元section1- >覆盖(“再见”);/ /输出现在显示“再见\ nWorld ! \ n”/ / clear()删除所有的部分内容……美元section2- >明确的();/ /输出现在显示“再见\ n”/ /……但是你也可以删除一个给定的行数/ /(本例中删除部分)的最后两行美元section1- >清楚(2);/ /输出现在完全是空的!返回0;}}

请注意

一个新行是附加在一段时自动显示信息。

输出部分让你操作控制台输出在先进的方面,如多个显示进度条独立和更新附加行表已经呈现。

控制台输入

使用输入选项或参数来传递信息的命令:

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娱乐下载\组件\控制台\输入\InputArgument;/ /……受保护的函数配置():无效{美元/ /配置一个论点- >addArgument (“用户名”,InputArgument::必需的,用户的用户名。)/ /……;}/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出):int{美元输出- >writeln ([“用户的创造者”,' = = = = = = = = = = = = ',]);/ /获取参数值使用getArgument ()美元输出- >writeln (的用户名:美元输入- >getArgument (“用户名”));返回0;}

现在,您可以通过命令的用户名:

1 2 3 4 5
美元php bin /控制台应用程序:创建用户Wouter用户创造者= = = = = = = = = = = =用户名:Wouter

另请参阅

控制台输入(参数和选项)更多信息关于控制台选项和参数。

服务从服务容器

创建一个新的用户,命令访问一些服务。因为你的命令已经注册为一个服务,您可以使用正常的依赖注入。想象你有一个应用\ \ UserManager服务服务,你想访问:

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
/ /……使用应用程序\服务\UserManager;使用ob娱乐下载\组件\控制台\命令\命令;CreateUserCommand扩展命令{私人美元userManager;公共函数__construct(UserManager美元userManager){美元- >userManager =美元userManager;::__construct ();}/ /……受保护的函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元- >userManager- >创建(美元输入- >getArgument (“用户名”));美元输出- >writeln (“用户生成成功!”);返回0;}}

命令的生命周期

命令有三个生命周期方法调用在运行命令:

初始化() (可选)
这个方法之前执行(交互)execute ()方法。它的主要目的是使用初始化变量命令的其他方法。
(交互) (可选)
该方法后执行初始化()之前,execute ()。其目的是检查的一些选项/参数是否失踪,交互式地问用户输入这些值。这是最后的地方你可以询问丢失的选项和参数。这个命令后,失踪的选项/参数会导致一个错误。
execute () (必需)

该方法后执行(交互)初始化()。它包含的逻辑你想要执行的命令,它应该返回一个整数,将用作命令退出状态

4.4

不返回一个整数的退出状态的结果execute ()弃用,因为Symfony 4.4。ob娱乐下载

测试命令

ob娱乐下载Symfony提供了一些工具来帮助你测试你的命令。最有用的一个是CommandTester类。它使用特殊的输入和输出类来缓解测试没有真正的控制台:

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
/ /测试/命令/ CreateUserCommandTest.php名称空间应用程序\测试\命令;使用ob娱乐下载\\FrameworkBundle\控制台\应用程序;使用ob娱乐下载\\FrameworkBundle\测试\KernelTestCase;使用ob娱乐下载\组件\控制台\测试人员\CommandTester;CreateUserCommandTest扩展KernelTestCase{公共函数testExecute(){美元内核=自我::bootKernel ();美元应用程序=应用程序(美元内核);美元命令=美元应用程序- >找到(“应用程序:创建用户”);美元commandTester=CommandTester (美元命令);美元commandTester- >执行([/ /传递参数的帮手“用户名”= >“Wouter”,/ /前缀的关键有两个破折号传递选项时,/ / e。旅客:“——一些期权”= >“option_value”,/ /使用括号来测试数组的值,/ / e。旅客:“——一些期权”= >“option_value”,]);/ /控制台的命令的输出美元输出=美元commandTester- >getDisplay ();美元- >assertStringContainsString (“用户名:Wouter”,美元输出);/ /……}}

提示

你也可以测试一个控制台应用程序通过使用ApplicationTester

谨慎

在测试使用的命令CommandTester类,控制台事件不是派遣。如果你需要测试这些事件,使用ApplicationTester代替。

谨慎

在测试使用的命令ApplicationTester类,别忘了禁用自动退出旗:

1 2 3 4
美元应用程序=应用程序();美元应用程序- >setAutoExit ();美元测试人员=ApplicationTester (美元应用程序);

请注意

当使用控制台组件在一个独立的项目中,使用应用程序和扩展的正常框架\ PHPUnit) \ \ TestCase

记录命令错误

只要在运行命令时抛出异常,Symfony为它添加了一个日志消息包括整个命令失败。ob娱乐下载此外,Symfony注册一ob娱乐下载个事件订阅者ConsoleEvents:终止事件并添加一个日志消息命令时没有完成的0退出状态

了解更多

控制台组件还包含一组“助手”——不同的小工具能够帮助你与不同的任务:

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。