Symfony新手。在SO阅读了一些Symfony文档和一些答案后,我现在几乎完全糊涂了。 我正在尝试使用控制台应用程序组件并创建一个小型的db-aware控制台应用程序。
许多人声称,为了使用Symfony的DI功能,继承我的命令类就足够了,而不是从Symfony \ Component \ Console \ Command \ Command继承,而是从ContainerAwareCommand继承。 但是,当我尝试这个时,我在application :: getKernel()调用上得到一个Method Not Found错误。
我觉得DI功能实际上在基于控制台组件的控制台应用程序中不可用。是否有另一种Symfony控制台应用程序,例如,基于完整的框架?
我非常喜欢控制台组件Symfony \ Component \ Console \ Application提供的简单框架。但问题是 - 如何处理依赖注入和DBAL?我找到的所有示例似乎都引用了完整的Symfony框架,让我更加困难。
答案 0 :(得分:3)
如果有人遇到同样的问题,只需快速了解我的进展情况。
我无法弄清楚的一件事是如何在没有我帮助的情况下让DI库实例化命令类,所以我实际上必须将容器本身注入我重写的应用程序类并覆盖{{1}然后我在那里手动将实例拉出容器。不理想,但现在必须做。
答案 1 :(得分:1)
如果您的命令扩展ContainerAwareCommand
...
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
...
class MyCommand extends ContainerAwareCommand
{
DI容器可以使用getContainer()
方法。 (比如在标准控制器中),例如:
$this->validator = $this->getContainer()->get('validator');
答案 2 :(得分:0)
我不知道你的问题是否仍然相关,但我有一个答案,因为我偶然发现了同样的问题。
您只需自己创建内核并将其提供给扩展基本\ Symfony \ Component \ Console \ Application的\ Symfony \ Bundle \ FrameworkBundle \ Console \ Application。
<?php
// CronRun.php
require __DIR__.'/../../../../vendor/autoload.php';
require_once __DIR__.'/../../../../app/AppKernel.php';
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
$application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
$application->add(new \KingdomHall\TaskBundle\Command\CronCommand());
$input = new \Symfony\Component\Console\Input\StringInput('k:c:r');
$application->run($input);