控制台命令
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.2,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
控制台命令
Symf欧宝娱乐app下载地址ony框架通过bin /控制台
脚本(例如著名的bin /控制台缓存:清楚
命令)。命令创建这些命令控制台组件.您还可以使用它来创建自己的命令。
新建命令
类中定义的命令必须在类中创建命令
你的包的名称空间(例如:AppBundle \命令
),他们的名字必须以命令
后缀。
例如,调用CreateUser
必须遵循这个结构:
12 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$输出){/ /……}}
配置命令
中配置命令的名称配置()
方法。然后,可以选择定义帮助消息和输入选项和参数:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /……受保护的函数配置(){$这//命令的名称(bin/console后面的部分)->setName (“应用程序:创建用户”)//当运行"php bin/console list"时显示的简短描述->setDescription (“创建新用户。”)//运行命令时显示的完整命令描述// "——help"选项->setHelp (“此命令允许您创建一个用户……”);}
执行命令
配置完成后,可以在终端上执行该命令:
1
$PHP bin/控制台应用程序:create-user
正如您所期望的,这个命令不会做任何事情,因为您还没有编写任何逻辑。类型中添加自己的逻辑execute ()
方法,该方法可以访问输入流(例如选项和参数)和输出流(将消息写入控制台):
12 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 bin/控制台应用程序:create-user用户创建============哇!完成创建用户的操作。
控制台输入
使用输入选项或参数将信息传递给命令:
12 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 bin/控制台app:create-user Wouter用户创建者============用户名:Wouter
另请参阅
读控制台输入(参数和选项)有关控制台选项和参数的详细信息。
从服务容器中获取服务
要真正创建一个新用户,该命令必须访问一些服务.这可以通过执行命令extend的ContainerAwareCommand而不是:
12 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类。它使用特殊的输入和输出类来简化测试,而无需真正的控制台:
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
/ /测试/ AppBundle /命令/ CreateUserCommandTest.php名称空间测试\AppBundle\命令;使用AppBundle\命令\CreateUserCommand;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制台\应用程序;使用欧宝娱乐app下载地址\包\FrameworkBundle\测试\KernelTestCase;使用欧宝娱乐app下载地址\组件\控制台\测试人员\CommandTester;类CreateUserCommandTest扩展KernelTestCase{公共函数testExecute(){自我::bootKernel ();$应用程序=新应用程序(自我:: $内核);$应用程序->add (新CreateUserCommand ());$命令=$应用程序->找到(“应用程序:创建用户”);$commandTester=新CommandTester ($命令);$commandTester->执行(数组(“命令”= >$命令->getName (),//传递参数给helper“用户名”= >“Wouter”,//当传递选项时,在键前加上两个破折号,//示例:'——some-option' => 'option_value',));//控制台中命令的输出$输出=$commandTester->getDisplay ();$这->assertContains (“用户名:Wouter”,$输出);/ /……}}
提示
您还可以通过使用ApplicationTester.
请注意
在独立项目中使用Console组件时,请使用欧宝娱乐app下载地址Symfony \ \ \ \ \ \控制台应用程序的组件延伸法线框架\ PHPUnit) \ \ TestCase
.
要能够为控制台测试使用完全设置的服务容器,您可以从扩展测试KernelTestCase:
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
/ /……使用欧宝娱乐app下载地址\组件\控制台\测试人员\CommandTester;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制台\应用程序;使用欧宝娱乐app下载地址\包\FrameworkBundle\测试\KernelTestCase;类CreateUserCommandTest扩展KernelTestCase{公共函数testExecute(){$内核=静态::createKernel ();$内核->引导();$应用程序=新应用程序($内核);$应用程序->add (新CreateUserCommand ());$命令=$应用程序->找到(“应用程序:创建用户”);$commandTester=新CommandTester ($命令);$commandTester->执行(数组(“命令”= >$命令->getName (),“用户名”= >“Wouter”));$输出=$commandTester->getDisplay ();$这->assertContains (“用户名:Wouter”,$输出);/ /……}}