控制台命令
编辑该页面控制台命令
Symfob娱乐下载ony框架提供了通过大量的命令bin /控制台
脚本(如著名的bin /控制台缓存:清楚
命令)。这些命令创建控制台组件。您还可以使用它来创建你自己的命令。
运行命令
每个Symob娱乐下载fony应用程序附带了一个大型的命令集。您可以使用列表
命令查看应用程序中的所有可用的命令:
1 2 3 4 5 6 7 8 9 10 11 12 13
美元php bin /控制台列表…可用命令:显示当前项目完成信息转储shell脚本完成帮助显示帮助为一个命令资产:资产清单列表命令安装安装包的网络资产一个公共目录缓存缓存:明确清除缓存…
如果你找到你所需要的命令,你可以运行它——帮助
选项来查看命令的文档:欧宝官网下载app
1
美元php资产:bin /控制台安装—帮助
APP_ENV & APP_DEBUG
控制台命令的运行环境中定义的APP_ENV
变量的.env
文件,这是dev
默认情况下。它还读取APP_DEBUG
打开或关闭“调试”模式的价值(它默认1
,)。
在另一个环境中运行该命令或调试模式,编辑的价值APP_ENV
和APP_DEBUG
。您还可以定义这个env var运行该命令时,例如:
1 2
# prod环境清空缓存美元APP_ENV = prod php bin /控制台缓存:清楚
控制台完成
6.1
控制台完成鱼是在Symfony 6.1中引入的。ob娱乐下载
6.2
控制台完成Zsh是在Symfony 6.2中引入的。ob娱乐下载
如果您正在使用Bash, Zsh或鱼壳,您可以安装Symfony的完成脚本自动完成终端输入命令时。ob娱乐下载所有命令支持名称和选择完成,有些甚至可以完整的价值观。
首先,你必须安装完成脚本一次。运行bin /控制台完成——帮助
为您的shell的安装说明。
请注意
当使用Bash,确保您安装和设置“Bash完成”包为您的操作系统(通常叫bash-completion
)。
在安装和重新启动您的终端,你完成所有设置为使用(默认情况下,按下Tab键)。
提示
许多PHP使用Symfony控制台工具构建组件(例如作曲家,PHPstob娱乐下载an和Behat)。如果他们使用的是版本5.4或更高版本,你也可以安装完成脚本启用控制台完成:
1 2
美元php供应商/ bin / 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名称空间应用程序\命令;使用ob娱乐下载\组件\控制台\属性\AsCommand;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;/ /命令是用户键入的名称“php bin /控制台”后# (AsCommand(名字:“应用程序:创建用户”)]类CreateUserCommand扩展命令{受保护的函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……把这里的代码来创建用户/ /这个方法必须返回一个整数“退出状态码”/ /命令。您还可以使用这些常量使代码更加可读/ /返回这个问题如果没有运行命令/ /(相当于返回int (0))返回命令::成功;/ /或返回执行期间如果发生了一些错误/ /(相当于返回int (1))/ /返回命令:失败;/ /或返回这显示不正确的命令用法;如无效选项/ /或丢失参数(相当于返回int (2))/ /返回命令:无效的}}
配置命令
您可以定义一个描述、消息和帮助输入选项和参数通过重写配置()
方法:
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 ()
而不是静态属性的方法。
的配置()
方法被调用结束时自动命令构造函数。如果你的命令定义自己的构造函数,设置属性,然后调用父构造函数,使这些属性中可用配置()
方法:
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::可选的,“用户密码”);}}
注册命令
你可以注册命令通过添加AsCommand
属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /命令/ CreateUserCommand.php名称空间应用程序\命令;使用ob娱乐下载\组件\控制台\属性\AsCommand;使用ob娱乐下载\组件\控制台\命令\命令;/ /“名称”和“描述”论点AsCommand取代/ /静态defaultName美元defaultDescription属性# [AsCommand (名称:“应用程序:创建用户”描述:创建一个新用户。隐藏:假别名:[应用:添加用户的)))类CreateUserCommand扩展命令{/ /……}
如果你不能使用PHP属性,命令作为服务和注册标记它与console.command
标签。如果你使用默认的服务。yaml的配置,这已经为你做好了,谢谢自动配置。
控制台输出
的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 35 36 37 38 39 40
/ /……使用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);/ /输出现在完全是空的!/ /设置的最大高度将新行部分取代旧的美元section1- >setMaxHeight (2);美元section1- >writeln (“Line1”);美元section1- >writeln (“么”);美元section1- >writeln (“Line3”);返回命令::成功;}}
请注意
一个新行是附加在一段时自动显示信息。
6.2
一个控制台的功能限制高度部分是在Symfony 6.2中引入的。ob娱乐下载
控制台输入
使用输入选项或参数来传递信息的命令:
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 (“用户名”));返回命令::成功;}
现在,您可以通过命令的用户名:
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
/ /……使用应用程序\服务\UserManager;使用ob娱乐下载\组件\控制台\命令\命令;类CreateUserCommand扩展命令{公共函数__construct(私人UserManager美元userManager,){父::__construct ();}/ /……受保护的函数执行(InputInterface美元输入,OutputInterface美元输出):int{/ /……美元这- >userManager- >创建(美元输入- >getArgument (“用户名”));美元输出- >writeln (“用户生成成功!”);返回命令::成功;}}
命令的生命周期
命令有三个生命周期方法调用在运行命令:
- 初始化() (可选)
-
这个方法之前执行
(交互)
和execute ()
方法。它的主要目的是使用初始化变量命令的其他方法。 - (交互) (可选)
-
该方法后执行
初始化()
之前,execute ()
。其目的是检查的一些选项/参数是否失踪,交互式地问用户输入这些值。这是最后的地方你可以询问丢失的选项和参数。这个命令后,失踪的选项/参数会导致一个错误。 - execute () (必需)
-
该方法后执行
(交互)
和初始化()
。它包含的逻辑你想要执行的命令,它必须返回一个整数,将用作命令退出状态。
测试命令
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 34 35
/ /测试/命令/ CreateUserCommandTest.php名称空间应用程序\测试\命令;使用ob娱乐下载\包\FrameworkBundle\控制台\应用程序;使用ob娱乐下载\包\FrameworkBundle\测试\KernelTestCase;使用ob娱乐下载\组件\控制台\测试人员\CommandTester;类CreateUserCommandTest扩展KernelTestCase{公共函数testExecute(){美元内核=自我::bootKernel ();美元应用程序=新应用程序(美元内核);美元命令=美元应用程序- >找到(“应用程序:创建用户”);美元commandTester=新CommandTester (美元命令);美元commandTester- >执行([/ /传递参数的帮手“用户名”= >“Wouter”,/ /前缀的关键有两个破折号传递选项时,/ / e。旅客:“——一些期权”= >“option_value”,/ /使用括号来测试数组的值,/ / e。旅客:“——一些期权”= >“option_value”,]);美元commandTester- >assertCommandIsSuccessful ();/ /控制台的命令的输出美元输出=美元commandTester- >getDisplay ();美元这- >assertStringContainsString (“用户名:Wouter”,美元输出);/ /……}}
如果您使用的是方法应用,叫setAutoExit(假)
的命令结果CommandTester
。
提示
你也可以测试一个控制台应用程序通过使用ApplicationTester。
谨慎
在测试使用的命令CommandTester
类,控制台事件不是派遣。如果你需要测试这些事件,使用ApplicationTester代替。
谨慎
在测试使用的命令ApplicationTester类,别忘了禁用自动退出旗:
1 2 3 4
美元应用程序=新应用程序();美元应用程序- >setAutoExit (假);美元测试人员=新ApplicationTester (美元应用程序);
谨慎
当测试InputOption: VALUE_NONE
命令选项,您必须传递一个空值:
1 2
美元commandTester=新CommandTester (美元命令);美元commandTester- >执行([“——一些期权”= >”]);
请注意
当使用控制台组件在一个独立的项目中,使用应用程序和扩展的正常框架\ PHPUnit) \ \ TestCase
。
记录命令错误
只要在运行命令时抛出异常,Symfony为它添加了一个日志消息包括整个命令失败。ob娱乐下载此外,Symfony注册一ob娱乐下载个事件订阅者听ConsoleEvents:终止事件并添加一个日志消息命令时没有完成的0
退出状态。