我有一个命令行应用程序,到目前为止使用Symfony依赖注入组件 . 我现在发现我想添加命令行选项并改进输出的格式,而Symfony控制台组件似乎是一个不错的选择 .
但是,我无法理解如何让我的Symfony控制台命令类接收容器对象 .
我发现的文档使用的是ContainerAwareCommand类,但这来自FrameworkBundle - 这似乎是一个巨大的开销,需要添加到纯CLI应用程序,因为它需要进一步的捆绑,如路由,http,配置,缓存等,这里没有任何与我有任何关系 .
(现有SO问题How can i inject dependencies to Symfony Console commands?也假设FrameworkBundle,BTW . )
我在这里创建了一个测试存储库,其中包含一个说明问题的基本命令:https://github.com/joachim-n/console-with-di
2 回答
是的,整个框架不是必需的 . 在您的情况下,首先需要创建一种入口脚本 . 像这样的东西:
在这个例子中,我们创建容器,然后将命令注册为服务,在命令中添加一个依赖项(在我们的例子中是整个容器 - 但显然你可以创建另一个依赖项并注入它)并编译容器 . 然后我们只创建应用程序,将命令实例添加到应用程序并运行它 .
当然,您可以在
yaml
或xml
中保留容器的所有配置,甚至使用PHP格式 .自2018年和Symfony 3.4+ DI features以来,您可以将命令用作服务 .
You can find working demo here ,感谢@TravisCarden
简而言之:
1. App内核
2.服务
3. Bin文件
运行它
如果您对更详细的解释感兴趣,我写了一篇文章Why You Should Combine Symfony Console and Dependency Injection .