控制台命令

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

控制台命令

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

控制台:APP_ENV & APP_DEBUG

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

的值可在其他环境或调试模式下运行该命令APP_ENV而且APP_DEBUG

新建命令

命令在类扩展中定义命令.例如,你可能需要一个命令来创建一个用户:

12 34 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 36 37
/ / src /命令/ CreateUserCommand.php名称空间应用程序命令使用欧宝娱乐app下载地址组件控制台命令命令使用欧宝娱乐app下载地址组件控制台输入InputInterface使用欧宝娱乐app下载地址组件控制台输出OutputInterfaceCreateUserCommand扩展命令//命令的名称(bin/console后面的部分)受保护的静态defaultName“应用程序:创建用户”受保护的函数配置()无效/ /……受保护的函数执行(InputInterface输入, OutputInterface输出int/ /……将创建用户的代码放在这里//该方法必须返回一个包含"exit status code"的整数//命令。您还可以使用这些常量使代码更具可读性//如果运行该命令没有问题,则返回此值//(这相当于返回int(0))返回命令::成功;//或者如果在执行过程中发生错误,则返回此值//(这相当于返回int(1))// return命令::FAILURE;//或返回此命令以指示不正确的命令使用;例如无效选项//或缺少参数(相当于返回int(2))// return命令::无效}}

5.1

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

5.3

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

配置命令

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /……//当运行"php bin/console list"时显示的命令描述受保护的静态defaultDescription“创建新用户。”/ /……受保护的函数配置()无效//如果你不喜欢使用$defaultDescription静态属性,//你也可以使用这个方法来定义简短的描述:/ / - - - - - - > setDescription(……)//使用"——help"选项运行命令时显示的命令帮助->setHelp (“此命令允许您创建一个用户……”);}

定义defaultDescription美元属性而不是使用setDescription ()方法允许在不实例化其类的情况下获取命令描述。这使得PHP bin/控制台列表命令运行得更快。

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

5.3

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

配置()方法在命令构造函数的末尾自动调用。如果命令定义了自己的构造函数,请先设置属性,然后调用父构造函数,以使这些属性在配置()方法:

12 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下载地址组件控制台输入InputArgumentCreateUserCommand扩展命令/ /……公共函数__construct(保龄球requirePassword= false)//最佳实践建议首先调用父构造函数,然后//然后设置自己的属性。在这种情况下不成立//因为configure()需要在这个构造函数中设置属性->requirePassword =requirePassword::__construct ();}受保护的函数配置()无效/ /……->addArgument (“密码”->requirePassword吗?InputArgument::要求:输入::可选的,“用户密码”);}}

注册命令

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

执行命令

配置并注册该命令后,可以在终端上运行该命令:

1
PHP bin/控制台应用程序:create-user

正如您所期望的,这个命令不会做任何事情,因为您还没有编写任何逻辑。类型中添加自己的逻辑execute ()方法。

控制台输出

execute ()方法可以访问输出流以将消息写入控制台:

12 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://secure.php.net/iterator)生成并返回带有'yield' PHP关键字的消息输出->writeln (->someMethod ());//输出“\n”输出->writeln (“哇!”);//输出一条消息,而不在行末添加“\n”输出->写(“你就要去了。”);输出->写(“创建用户。”);返回命令::成功;}

现在,尝试执行命令:

1 2 3 4 5 6
php bin/控制台应用程序:create-user用户创建============哇!完成创建用户的操作。

输出部分

常规控制台输出可以划分为多个独立的区域,称为“输出部分”。当需要清除和覆盖输出信息时,可以创建一个或多个这样的部分。

类创建的部分ConsoleOutput:部分()的实例,该方法返回ConsoleSectionOutput

12 34 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下载地址组件控制台输出ConsoleOutputInterfaceMyCommand扩展命令受保护的函数执行(InputInterface输入, OutputInterface输出int如果(!输出运算符ConsoleOutputInterface) {\ LogicException ('此命令只接受' ConsoleOutputInterface '的实例。');}section1输出->节();section2输出->节();section1->writeln (“你好”);section2->writeln (“世界!”);//输出显示Hello\nWorld!\ n”// override()将所有现有的section内容替换为给定的内容section1->覆盖(“再见”);//输出现在显示"Goodbye\nWorld! "\ n”// clear()删除所有的section内容…section2->明确的();//现在显示"Goodbye\n"/ /……但也可以删除给定数量的行//(这个例子删除了section的最后两行)section1->清楚(2);//输出现在完全为空!返回命令::成功;}}

请注意

在显示节中的信息时,会自动追加新行。

输出部分允许您以高级方式操作控制台输出,例如显示多个进度条哪些是独立更新的向表中追加行已经被渲染过了。

控制台输入

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

12 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/控制台app:create-user Wouter用户创建者============用户名:Wouter

另请参阅

控制台输入(参数和选项)有关控制台选项和参数的详细信息。

从服务容器中获取服务

要真正创建一个新用户,该命令必须访问一些服务.由于您的命令已经注册为服务,您可以使用正常的依赖注入。想象一下你有一个应用\ \ UserManager服务您想访问的服务:

12 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(UserManageruserManager->userManager =userManager::__construct ();}/ /……受保护的函数执行(InputInterface输入, OutputInterface输出int/ /……->userManager->创建(输入->getArgument (“用户名”));输出->writeln (“用户成功生成!”);返回命令::成功;}}

命令的生命周期

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

初始化() (可选)
方法之前执行此方法(交互)execute ()方法。它的主要目的是初始化其余命令方法中使用的变量。
(交互) (可选)
之后执行此方法初始化()之前,execute ().它的目的是检查是否缺少一些选项/参数,并交互式地向用户询问这些值。这是您可以请求缺少的选项/参数的最后一个地方。执行此命令后,缺少选项/参数将导致错误。
execute () (必需)
之后执行此方法(交互)而且初始化().它包含您希望命令执行的逻辑,并且必须返回一个将用作命令的整数退出状态

测试命令

欧宝娱乐app下载地址Symfony提供了几个工具来帮助您测试命令。最有用的是CommandTester类。它使用特殊的输入和输出类来简化测试,而无需真正的控制台:

12 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
/ /测试/命令/ CreateUserCommandTest.php名称空间应用程序测试命令使用欧宝娱乐app下载地址FrameworkBundle控制台应用程序使用欧宝娱乐app下载地址FrameworkBundle测试KernelTestCase使用欧宝娱乐app下载地址组件控制台测试人员CommandTesterCreateUserCommandTest扩展KernelTestCase公共函数testExecute()内核自我::bootKernel ();应用程序应用程序(内核);命令应用程序->找到(“应用程序:创建用户”);commandTesterCommandTester (命令);commandTester->执行([//传递参数给helper“用户名”= >“Wouter”//当传递选项时,在键前加上两个破折号,//示例:'——some-option' => 'option_value',]);//控制台中命令的输出输出commandTester->getDisplay ();->assertStringContainsString (“用户名:Wouter”输出);/ /……}}

如果你正在使用方法应用,叫setAutoExit(假)来获取命令结果CommandTester

5.2

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

提示

您还可以通过使用ApplicationTester

谨慎

方法测试命令时CommandTester类时,控制台事件不会被分派。如果需要测试这些事件,请使用ApplicationTester代替。

谨慎

方法测试命令时ApplicationTester类,不要忘记禁用自动退出标志:

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

请注意

在独立项目中使用Console组件时,请使用应用程序延伸法线框架\ PHPUnit) \ \ TestCase

日志命令错误

无论何时在运行命令时抛出异常,Symfony都会为其添加一条日志消息,其中包括整个失败的命令。欧宝娱乐app下载地址此外,Symfony注册了欧宝娱乐app下载地址一个事件订阅者聆听ConsoleEvents:终止事件属性未结束命令时,添加一条日志消息0退出状态

了解更多

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

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode