控制台命令

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.7,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

控制台命令

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

创建一个命令

命令必须创建的类中定义命令你的包名称空间(如。AppBundle \命令)和他们的名字必须结束命令后缀。

例如,一个命令CreateUser必须遵循这个结构:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src / AppBundle /命令/ CreateUserCommand.php名称空间AppBundle\命令;使用欧宝娱乐app下载地址\组件\控制台\命令\命令;使用欧宝娱乐app下载地址\组件\控制台\输入\InputInterface;使用欧宝娱乐app下载地址\组件\控制台\输出\OutputInterface;CreateUserCommand扩展命令{受保护的函数配置(){/ /……}受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){/ /……}}

配置命令

首先,您必须配置的命令的名称配置()方法。然后你可以定义一个消息和帮助输入选项和参数:

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

注册命令

欧宝娱乐app下载地址Symfony命令必须注册之前使用它们。为了自动注册,一个命令必须:

  1. 存储在一个目录命令/;
  2. 一个类中定义的名字结尾命令;
  3. 定义在一个类,它扩展了命令

如果你不能满足这些条件,一个命令,另一种是手动命令注册为一个服务

执行命令

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

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

如您所料,这个命令将什么都不做你没有写任何逻辑。在添加自己的逻辑execute ()方法,获取输入流(如选项和参数)和输出流(写消息到控制台):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ /……受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){/ /多行输出到控制台(添加“\ n”结束时,每一行)美元输出- >writeln ([“用户的创造者”,' = = = = = = = = = = = = ',]);/ /输出消息紧随其后的是“\ n”美元输出- >writeln (“哇!”);/ /输出一条消息没有添加一个“\ n”的路线美元输出- >写(你要的);美元输出- >写(创建一个用户。);}

现在,尝试执行命令:

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

控制台输入

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
使用欧宝娱乐app下载地址\组件\控制台\输入\InputArgument;/ /……受保护的函数配置(){美元/ /配置一个论点- >addArgument (“用户名”,InputArgument::必需的,用户的用户名。)/ /……;}/ /……公共函数执行(InputInterface美元输入,OutputInterface美元输出){美元输出- >writeln ([“用户的创造者”,' = = = = = = = = = = = = ',]);/ /获取参数值使用getArgument ()美元输出- >writeln (的用户名:美元输入- >getArgument (“用户名”));}

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

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

另请参阅

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

服务从服务容器

创建一个新的用户,命令访问一些服务。可以通过命令扩展ContainerAwareCommand而不是:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ /……使用欧宝娱乐app下载地址\\FrameworkBundle\命令\ContainerAwareCommand;CreateUserCommand扩展ContainerAwareCommand{/ /……受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){/ /……/ /使用getContainer访问容器()美元userManager=美元- >getContainer ()- >get (“app.user_manager”);美元userManager- >创建(美元输入- >getArgument (“用户名”));美元输出- >writeln (“用户生成成功!”);}}

现在,一旦您创建了所需的服务和逻辑,命令将执行create ()的方法app.user_manager服务和用户将被创建。

命令的生命周期

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

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

提示

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

请注意

当使用控制台组件在一个独立的项目中,使用欧宝娱乐app下载地址Symfony \ \ \ \ \ \控制台应用程序的组件和扩展的正常框架\ PHPUnit) \ \ TestCase

能够使用完全为您的控制台设置服务容器测试可以扩展您的测试KernelTestCase:

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
/ /……使用欧宝娱乐app下载地址\组件\控制台\测试人员\CommandTester;使用欧宝娱乐app下载地址\\FrameworkBundle\控制台\应用程序;使用欧宝娱乐app下载地址\\FrameworkBundle\测试\KernelTestCase;CreateUserCommandTest扩展KernelTestCase{公共函数testExecute(){美元内核=静态::createKernel ();美元内核- >引导();美元应用程序=应用程序(美元内核);美元应用程序- >add (CreateUserCommand ());美元命令=美元应用程序- >找到(“应用程序:创建用户”);美元commandTester=CommandTester (美元命令);美元commandTester- >执行(数组(“命令”= >美元命令- >getName (),“用户名”= >“Wouter”));美元输出=美元commandTester- >getDisplay ();美元- >assertContains (“用户名:Wouter”,美元输出);/ /……}}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。