如何创建一个控制台命令吗
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
如何创建一个控制台命令吗
控制台页面组件的部分(控制台组件)介绍了如何创建一个控制台命令。这食谱文章涵盖了差异在创建控制台命令在Symfony框架。ob娱乐下载
自动注册命令
Symfony自动提供控制台命令,创建一个ob娱乐下载命令
目录在你的包和创建一个PHP文件后缀为Command.php
你想提供的每个命令。例如,如果你想延长AcmeDemoBundle迎接你从命令行,创造GreetCommand.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日25日26日27 28 29 30 31 32 33 34 35 36 37
/ / src / Acme / DemoBundle /命令/ GreetCommand.php名称空间Acme\DemoBundle\命令;使用ob娱乐下载\包\FrameworkBundle\命令\ContainerAwareCommand;使用ob娱乐下载\组件\控制台\输入\InputArgument;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输入\InputOption;使用ob娱乐下载\组件\控制台\输出\OutputInterface;类GreetCommand扩展ContainerAwareCommand{受保护的函数配置(){美元这- >setName (“演示:问候”)- >setDescription (“欢迎某人”)- >addArgument (“名字”,InputArgument::可选的,“你想问谁?”)- >使用addOption (“喊”,零,InputOption::VALUE_NONE,如果设置,任务会大喊大写字母的);}受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){美元的名字=美元输入- >getArgument (“名字”);如果(美元的名字){美元文本=“你好”。美元的名字;}其他的{美元文本=“你好”;}如果(美元输入- >getOption (“喊”)){美元文本= strtoupper (美元文本);}美元输出- >writeln (美元文本);}}
这个命令将现在可用自动运行:
1
美元app /控制台演示:欢迎法比安
服务从服务容器
通过使用ContainerAwareCommand作为基类命令(而不是更基本命令),您可以访问服务容器。换句话说,你可以访问任何配置服务:
1 2 3 4 5 6 7 8
受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){美元的名字=美元输入- >getArgument (“名字”);美元日志记录器=美元这- >getContainer ()- >get (“日志”);美元日志记录器- >信息(“执行命令”。美元的名字);/ /……}
然而,由于容器范围这段代码不会为一些服务工作。例如,如果你想获得请求
相关服务或其他服务,你会得到以下错误:
1
你不能创建一个服务(“请求”)的一个活动范围(“请求”)。
考虑下面的示例,它使用翻译
服务使用控制台命令翻译一些内容:
1 2 3 4 5 6 7 8 9 10
受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){美元的名字=美元输入- >getArgument (“名字”);美元翻译=美元这- >getContainer ()- >get (“翻译”);如果(美元的名字){美元输出- >writeln (美元翻译- >反式(“你好% % !”,数组(%的名字%的= >美元的名字)));}其他的{美元输出- >writeln (美元翻译- >反式(“你好!”));}}
如果你深入研究翻译组件类,你会看到的请求
服务是需要语言环境的内容翻译:
1 2 3 4 5 6 7 8 9 10
/ /供应商/ syob娱乐下载mfony / symfony / src / symfony /包/ FrameworkBundle /翻译/ Translator.php公共函数getLocale(){如果(零= = =美元这- >语言环境& &美元这- >容器- >isScopeActive (“请求”)& &美元这- >容器- >有(“请求”)){美元这- >语言环境=美元这- >容器- >get (“请求”)- >getLocale ();}返回美元这- >语言环境;}
因此,当使用翻译
服务在一个命令,你会得到前面“你不能创建一个服务的活动范围”错误消息。解决方案在这种情况下一样容易设置语言环境值显式地在翻译内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){美元的名字=美元输入- >getArgument (“名字”);美元语言环境=美元输入- >getArgument (“场所”);美元翻译=美元这- >getContainer ()- >get (“翻译”);美元翻译- >setLocale (美元语言环境);如果(美元的名字){美元输出- >writeln (美元翻译- >反式(“你好% % !”,数组(%的名字%的= >美元的名字)));}其他的{美元输出- >writeln (美元翻译- >反式(“你好!”));}}
然而对于其他服务解决方案可能更复杂。更多细节,请参阅如何使用范围。
测试命令
当测试命令作为完整的框架的一部分ob娱乐下载Symfony包\ \ \ \ \ \ FrameworkBundle \ \控制台应用程序应该用来代替ob娱乐下载Symfony \ \ \ \ \ \控制台应用程序的组件:
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娱乐下载\组件\控制台\测试人员\CommandTester;使用ob娱乐下载\包\FrameworkBundle\控制台\应用程序;使用Acme\DemoBundle\命令\GreetCommand;类ListCommandTest扩展\PHPUnit_Framework_TestCase{公共函数testExecute(){/ /模拟内核或创建一个取决于你的需求美元应用程序=新应用程序(美元内核);美元应用程序- >add (新GreetCommand ());美元命令=美元应用程序- >找到(“演示:问候”);美元commandTester=新CommandTester (美元命令);美元commandTester- >执行(数组(“名字”= >“法”,”,大喊“= >真正的));美元这- >assertRegExp (“/……”,美元commandTester- >getDisplay ());/ /……}}
2.4
因为Symfob娱乐下载ony 2.4,CommandTester
自动检测执行命令的名称。Symfony 2ob娱乐下载.4之前,你需要把它通过命令
关键。
请注意
在上面的具体案例中,的名字
参数和——大喊
选项不是强制命令来工作,但是显示你可以看到如何定制的时候调用命令。
能够使用完全为您的控制台设置服务容器测试可以扩展您的测试WebTestCase:
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
使用ob娱乐下载\组件\控制台\测试人员\CommandTester;使用ob娱乐下载\包\FrameworkBundle\控制台\应用程序;使用ob娱乐下载\包\FrameworkBundle\测试\WebTestCase;使用Acme\DemoBundle\命令\GreetCommand;类ListCommandTest扩展WebTestCase{公共函数testExecute(){美元内核=美元这- >createKernel ();美元内核- >引导();美元应用程序=新应用程序(美元内核);美元应用程序- >add (新GreetCommand ());美元命令=美元应用程序- >找到(“演示:问候”);美元commandTester=新CommandTester (美元命令);美元commandTester- >执行(数组(“名字”= >“法”,”,大喊“= >真正的));美元这- >assertRegExp (“/……”,美元commandTester- >getDisplay ());/ /……}}