控制台命令
编辑本页控制台命令
Symfob娱乐下载ony框架通过bin /控制台
脚本(例如著名的bin /控制台缓存:清楚
命令)。命令创建这些命令控制台组件.您还可以使用它来创建自己的命令。
运行命令
每个Symob娱乐下载fony应用程序都有一组命令。您可以使用列表
命令查看应用程序中所有可用的命令:
12 3 4 5 6 7 8 9 10 11 12 13
$PHP bin/控制台列表可选命令:about显示当前工程完成信息转储shell完成脚本帮助显示帮助为一个命令list列出命令资产资产:install安装包在一个公共目录下的web资产缓存缓存:clear清除缓存…
如果找到了所需的命令,可以使用——帮助
选项查看命令的文档:欧宝官网下载app
1
$PHP bin/控制台资产:install——.帮助
App_env & app_debug
控制台命令在环境定义在APP_ENV
的变量.env
文件,也就是dev
默认情况下。它还读取APP_DEBUG
值打开或关闭“调试”模式(默认为1
,是开着的)。
的值可在其他环境或调试模式下运行该命令APP_ENV
而且APP_DEBUG
.你也可以在运行命令时定义这个env vars,例如:
1 2
#清除prod环境的缓存$APP_ENV=prod php bin/console cache:clear
控制台完成
6.1
Fish的控制台补全在Symfony 6.1中引入。ob娱乐下载
6.2
Zsh的控制台补全是在Symfony 6.2中引入的。ob娱乐下载
如果您正在使用Bash、Zsh或Fish shell,您可以安装Symfony的补全脚本,以便在终端中输入命令时自动补全。ob娱乐下载所有命令都支持名称和选项补全,有些甚至可以补全值。
首先,您必须安装完成脚本一次.运行Bin /控制台完成——帮助
参阅shell的安装说明。
请注意
在使用Bash时,请确保为您的操作系统安装和设置了“Bash完成”包(通常命名为bash-completion
).
安装并重新启动终端后,您将全部设置为使用补全(默认情况下,通过按Tab键)。
提示
许多PHP工具都是使用Symfony控制台组件构建的(例如Composob娱乐下载er, PHPstan和Behat)。如果他们使用的是5.4或更高版本,你也可以安装他们的完成脚本来启用控制台完成:
1 2
$PHP vendor/bin/phpstan completion——帮助$作曲家完成——帮助
新建命令
命令在类扩展中定义命令.例如,你可能需要一个命令来创建一个用户:
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 32
/ / src /命令/ CreateUserCommand.php名称空间应用程序\命令;使用ob娱乐下载\组件\控制台\属性\AsCommand;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;// php bin/console命令的名称# (AsCommand(名字:“应用程序:创建用户”)]类CreateUserCommand扩展命令{受保护的函数执行(InputInterface$输入, OutputInterface$输出):int{/ /……将创建用户的代码放在这里//该方法必须返回一个包含"exit status code"的整数//命令。您还可以使用这些常量使代码更具可读性//如果运行该命令没有问题,则返回此值//(这相当于返回int(0))返回命令::成功;//或者如果在执行过程中发生错误,则返回此值//(这相当于返回int(1))// return命令::FAILURE;//或返回此命令以指示不正确的命令使用;例如无效选项//或缺少参数(相当于返回int(2))// return命令::无效}}
配置命令
您可以选择定义描述、帮助消息和输入选项和参数通过重写配置()
方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /命令/ CreateUserCommand.php/ /……类CreateUserCommand扩展命令{//当运行"php bin/console list"时显示的命令描述受保护的静态$defaultDescription=“创建新用户。”;/ /……受保护的函数配置():无效{$这//使用"——help"选项运行命令时显示的命令帮助->setHelp (“此命令允许您创建一个用户……”);}}
提示
定义defaultDescription美元
属性而不是使用setDescription ()
方法允许在不实例化其类的情况下获取命令描述。这使得PHP bin/控制台列表
命令运行得更快。
如果你想一直运行列表
命令快,添加——短
选项(PHP bin/控制台列表——短
).类型的命令将避免实例化命令类,但不会显示任何命令描述setDescription ()
方法,而不是静态属性。
的配置()
方法在命令构造函数的末尾自动调用。如果命令定义了自己的构造函数,请先设置属性,然后调用父构造函数,以使这些属性在配置()
方法:
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
/ /……使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputArgument;类CreateUserCommand扩展命令{/ /……公共函数__construct(保龄球$requirePassword= false){//最佳实践建议首先调用父构造函数,然后//然后设置自己的属性。在这种情况下不成立//因为configure()需要在这个构造函数中设置属性$这->requirePassword =$requirePassword;父::__construct ();}受保护的函数配置():无效{$这/ /……->addArgument (“密码”,$这->requirePassword吗?InputArgument::要求:输入::可选的,“用户密码”);}}
注册命令
在PHP 8和更新版本中,可以通过添加AsCommand
属性:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /命令/ CreateUserCommand.php名称空间应用程序\命令;使用ob娱乐下载\组件\控制台\属性\AsCommand;使用ob娱乐下载\组件\控制台\命令\命令;// AsCommand的"name"和"description"参数替换//静态$defaultName和$defaultDescription属性# [AsCommand (名称:“应用程序:创建用户”描述:“创建新用户。”隐藏:假,别名:[应用:添加用户的)))类CreateUserCommand扩展命令{/ /……}
如果不能使用PHP属性,请将该命令注册为服务和标记它与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://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 35 36 37 38 39 40
/ /……使用ob娱乐下载\组件\控制台\输出\ConsoleOutputInterface;类MyCommand扩展命令{受保护的函数执行(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);//输出现在完全为空!//设置一个section的最大高度将使新的行替换旧的行$section1->setMaxHeight (2);$section1->writeln (“Line1”);$section1->writeln (“么”);$section1->writeln (“Line3”);返回命令::成功;}}
请注意
在显示节中的信息时,会自动追加新行。
6.2
在Symfony 6.2中引入了限制控制台部分高度的特性。ob娱乐下载
控制台输入
使用输入选项或参数将信息传递给命令:
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
使用ob娱乐下载\组件\控制台\输入\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;使用ob娱乐下载\组件\控制台\命令\命令;类CreateUserCommand扩展命令{私人$userManager;公共函数__construct(UserManager$userManager){$这->userManager =$userManager;父::__construct ();}/ /……受保护的函数执行(InputInterface$输入, OutputInterface$输出):int{/ /……$这->userManager->创建($输入->getArgument (“用户名”));$输出->writeln (“用户成功生成!”);返回命令::成功;}}
命令的生命周期
命令有三个生命周期方法,在运行命令时调用:
- 初始化() (可选)
-
方法之前执行此方法
(交互)
和execute ()
方法。它的主要目的是初始化其余命令方法中使用的变量。 - (交互) (可选)
-
之后执行此方法
初始化()
之前,execute ()
.它的目的是检查是否缺少一些选项/参数,并交互式地向用户询问这些值。这是您可以请求缺少的选项/参数的最后一个地方。执行此命令后,缺少选项/参数将导致错误。 - execute () (必需)
-
之后执行此方法
(交互)
而且初始化()
.它包含您希望命令执行的逻辑,并且必须返回一个将用作命令的整数退出状态.
测试命令
ob娱乐下载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
/ /测试/命令/ CreateUserCommandTest.php名称空间应用程序\测试\命令;使用ob娱乐下载\包\FrameworkBundle\控制台\应用程序;使用ob娱乐下载\包\FrameworkBundle\测试\KernelTestCase;使用ob娱乐下载\组件\控制台\测试人员\CommandTester;类CreateUserCommandTest扩展KernelTestCase{公共函数testExecute(){$内核=自我::bootKernel ();$应用程序=新应用程序($内核);$命令=$应用程序->找到(“应用程序:创建用户”);$commandTester=新CommandTester ($命令);$commandTester->执行([//传递参数给helper“用户名”= >“Wouter”,//当传递选项时,在键前加上两个破折号,//示例:'——some-option' => 'option_value',//使用括号测试数组值//示例:'——some-option' => ['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->执行([“——一些期权”= >”]);
请注意
在独立项目中使用Console组件时,请使用应用程序延伸法线框架\ PHPUnit) \ \ TestCase
.
日志命令错误
无论何时在运行命令时抛出异常,Symfony都会为其添加一条日志消息,其中包括整个失败的命令。ob娱乐下载此外,Symfony注册了ob娱乐下载一个事件订阅者聆听ConsoleEvents:终止事件属性未结束命令时,添加一条日志消息0
退出状态.