我在使用完整的Symfony堆栈应用程序尝试使用Symfony2的控制台组件创建命令时遇到问题。
如果我尝试通过DI传递我的服务,当我尝试运行它时,该命令会抛出以下错误:
[Symfony\Component\Debug\Exception\ContextErrorException]
Notice: Trying to get property of non-object
如果我使用ContainerAwareCommand创建命令并尝试使用
获取我的服务$这 - > getContainer() - >获得( 'mtgu.api.card.list.response.data');
我得到了
[LogicException]
The container cannot be retrieved as the application instance is not yet set.
我的服务正在加载,因为它在前端控制器中使用。这个问题变得陌生,好像我传递了一个存储库服务 - 我没有遇到这个问题!
设置服务是否有一些技巧可以通过?或者我以某种方式搞砸了我的配置?
我通过在我的DI扩展中执行此操作来“自动加载”我的所有服务,而不是通过主要的services.yml将它们全部包含在内。我认为这或yml的顺序可能会影响它 - 但我已经尝试过手动包括所有内容但仍然没有快乐!
$finder = new Finder();
$finder->name('services.yml');
/**
* @var $file SplFileInfo
*/
foreach($finder->in(__DIR__.'/../') as $file) {
$loader = new Loader\YamlFileLoader($container, new FileLocator($file->getPath()));
$loader->load('services.yml');
}
供应商/捆绑/命令/ services.yml
services:
mtgu.command.slugify:
class: MightyStudios\MtguBundle\Command\SlugifyCommand
tags:
- { name: console.command }
arguments:
- @mtgu.api.card.list.response.data
我认为这可能只是一些配置问题,但Google未能找到答案!有没有其他人遇到这个问题,他们可以放弃任何光明!?
非常感谢
答案 0 :(得分:3)
更好的结构是将您的服务文件放在捆绑包的Resources/config
目录中(另请参阅所有核心捆绑包)。但是,将它放在一边。
问题由异常描述:由于尚未设置应用程序实例,因此无法检索容器。当$this->application
为null
时,ContainerAwareCommand#getContainer()
方法会抛出这个问题。 $this->getContainer()
。应用程序在Application#add()
方法的第一行中设置。
这意味着在将命令添加到应用程序之前调用Command#execute()
。也许你在构造函数中使用它?
如果有,请将其删除,仅使用Command#interact()
,Command#initialize()
或{{1}}中的容器。