控制台命令

编辑该页面

控制台命令

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

运行命令

每个Sym欧宝娱乐app下载地址fony应用程序附带了一个大型的命令集。您可以使用列表命令查看应用程序中的所有可用的命令:

1 2 3 4 5 6 7 8 9 10 11 12 13
美元php bin /控制台列表…可用命令:显示当前项目完成信息转储shell脚本完成帮助显示帮助一个命令资产:资产清单列表命令安装安装包的网络资产一个公共目录缓存缓存:明确清除缓存…

如果你找到你所需要的命令,你可以运行它——帮助选项来查看命令的文档:欧宝体育电话

1
美元php资产:bin /控制台安装—帮助

APP_ENV & APP_DEBUG

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

在另一个环境中运行该命令或调试模式,编辑的价值APP_ENVAPP_DEBUG。您还可以定义这个env var运行该命令时,例如:

1 2
# prod环境清空缓存美元APP_ENV = prod php bin /控制台缓存:清楚

控制台完成

5.4

控制台完成Bash是在Symfony 5.4中引入的。欧宝娱乐app下载地址

如果您正在使用Bash shell,您可以安装Symfony的完成脚本自动完成终端输入命令时。欧宝娱乐app下载地址所有命令支持名称和选择完成,有些甚至可以完整的价值观。

首先,确保您安装和设置“bash完成”包为您的操作系统(通常叫bash-completion)。然后,安装Symfony完成bash欧宝娱乐app下载地址脚本一次通过运行完成在Symfony应用程序在欧宝娱乐app下载地址您的计算机上安装命令:

1 2
美元php bin /控制台完成bash | sudo三通/etc/bash_completion.d / console-events-terminate#安装后,重新启动shell

现在你已经准备好使用自动完成所有Symfony控制台应用程序在您的计算机上。欧宝娱乐app下载地址默认情况下,您可以获得完整的列表选项按Tab键。

提示

许多PHP使用Symfony控制台工具构建组件(例如作曲家,PHPst欧宝娱乐app下载地址an和Behat)。如果他们使用的是版本5.4或更高版本,你也可以安装完成脚本启用控制台完成:

1
美元php供应商/ bin / bash | sudo phpstan完成三通/etc/bash_completion.d / phpstan

创建一个命令

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

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
/ / src /命令/ CreateUserCommand.php名称空间应用程序\命令;使用欧宝娱乐app下载地址\组件\控制台\命令\命令;使用欧宝娱乐app下载地址\组件\控制台\输入\InputInterface;使用欧宝娱乐app下载地址\组件\控制台\输出\OutputInterface;CreateUserCommand扩展命令{/ /命令的名称(“bin /控制台”后的部分)受保护的静态美元defaultName=“应用程序:创建用户”;受保护的函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……把这里的代码来创建用户/ /这个方法必须返回一个整数“退出状态码”/ /命令。您还可以使用这些常量使代码更加可读/ /返回这个问题如果没有运行命令/ /(相当于返回int (0))返回命令::成功;/ /或返回执行期间如果发生了一些错误/ /(相当于返回int (1))/ /返回命令:失败;/ /或返回这显示不正确的命令用法;如无效选项/ /或丢失参数(相当于返回int (2))/ /返回命令:无效的}}

5.1

命令::成功命令:失败常量是在Symfony 5.1中引入的。欧宝娱乐app下载地址

5.3

命令:无效常量是在Symfony 5.3中引入的欧宝娱乐app下载地址

配置命令

您可以定义一个描述、消息和帮助输入选项和参数通过重写配置()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /命令/ CreateUserCommand.php/ /……CreateUserCommand扩展命令{/ /命令描述运行时显示“php bin /控制台名单”受保护的静态美元defaultDescription=创建一个新用户。;/ /……受保护的函数配置():无效{美元/ /运行时显示的命令帮助命令”——帮助”选项- >setHelp (“这个命令允许您创建一个用户……”);}}

提示

定义defaultDescription美元静态属性,而不是使用setDescription ()方法允许的命令没有实例化的类描述。这使得php bin /控制台列表命令运行更快。

如果你想一直运行列表命令快速,添加——短选择它(php bin /控制台——短名单)。这将避免类实例化命令,但不会显示任何描述使用的命令setDescription ()而不是静态属性的方法。

5.3

defaultDescription美元静态属性和——短选择在Symfony 5.3中引入的。欧宝娱乐app下载地址

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

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

注册命令

在PHP 8和更新的版本中,您可以通过添加注册命令AsCommand属性:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /命令/ CreateUserCommand.php名称空间应用程序\命令;使用欧宝娱乐app下载地址\组件\控制台\属性\AsCommand;使用欧宝娱乐app下载地址\组件\控制台\命令\命令;/ /“名称”和“描述”论点AsCommand取代/ /静态defaultName美元defaultDescription属性# [AsCommand (名称:“应用程序:创建用户”描述:创建一个新用户。隐藏:别名:[应用:添加用户的)))CreateUserCommand扩展命令{/ /……}

5.3

使用PHP的能力属性配置命令是在Symfony 5.3中引入的。欧宝娱乐app下载地址

如果你不能使用PHP属性,命令作为服务和注册标记它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”的路线美元输出- >写(你要的);美元输出- >写(创建一个用户。);返回命令::成功;}

现在,尝试执行命令:

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
/ /……使用欧宝娱乐app下载地址\组件\控制台\输出\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);/ /输出现在完全是空的!返回命令::成功;}}

请注意

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

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

控制台输入

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

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

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

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

命令的生命周期

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

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

测试命令

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

如果您使用的是方法应用,叫setAutoExit(假)的命令结果CommandTester

5.2

setAutoExit ()方法应用程序的方法是在Symfony 5.2中引入的。欧宝娱乐app下载地址

5.4

assertCommandIsSuccessful ()方法是在Symfony 5.4中引入的。欧宝娱乐app下载地址

提示

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

谨慎

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

谨慎

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

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

谨慎

当测试InputOption: VALUE_NONE命令选项,您必须传递一个空值:

1 2
美元commandTester=CommandTester (美元命令);美元commandTester- >执行([“——一些期权”= >]);

请注意

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

记录命令错误

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

了解更多

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

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
控制台组件支持通过Les-Tilleuls.coop