Symfony控制台应用程序:依赖注入

时间:2014-09-21 12:36:40

标签: php symfony dependency-injection dbal

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框架,让我更加困难。

3 个答案:

答案 0 :(得分:3)

如果有人遇到同样的问题,只需快速了解我的进展情况。

  1. 我在我的项目中加入了PHP-DI依赖注入框架,它似乎在没有配置的情况下运行得相当好(到目前为止) - 实际上它通过反射得出了很多。
  2. 同样,Doctrine \ DBAL作为一个独立的库包含在内(我选择了它的O / RM部分,因为它实际上是一个很小的项目,而且我在SQL上比任何东西都更加坚固否则)连接只是由连接提供程序返回,连接提供程序在DI需要的地方注入。
  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);
相关问题