Php Symfony控制台应用程序:依赖项注入
这里有一个Symfony新手。在阅读了一些Symfony文档和这里的一些答案之后,我现在几乎完全困惑了。 我正在尝试使用console应用程序组件并创建一个小型的db感知控制台应用程序Php Symfony控制台应用程序:依赖项注入,php,symfony,dependency-injection,dbal,Php,Symfony,Dependency Injection,Dbal,这里有一个Symfony新手。在阅读了一些Symfony文档和这里的一些答案之后,我现在几乎完全困惑了。 我正在尝试使用console应用程序组件并创建一个小型的db感知控制台应用程序 <?php // CronRun.php require __DIR__.'/../../../../vendor/autoload.php'; require_once __DIR__.'/../../../../app/AppKernel.php'; $kernel = new AppKernel(
<?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);
许多人表示,为了使用Symfony的DI功能,不从Symfony\Component\Console\command\command而是从ContainerWareCommand继承我的命令类就足够了。
但是,当我尝试此操作时,在application::getKernel()调用中出现了一个methodnotfound错误
我有一种感觉,在基于控制台组件的控制台应用程序中,DI功能实际上是不可用的。例如,是否有另一种基于成熟框架的Symfony控制台应用程序
我非常喜欢控制台组件Symfony\component\console\Application提供的简单框架。但问题是——依赖注入和DBAL怎么办?我发现的所有示例似乎都引用了完整的Symfony框架,让我更加困惑 如果您的命令扩展了
ContainerWareCommand
...
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
...
class MyCommand extends ContainerAwareCommand
{
DI容器可通过getContainer()
方法使用。(与标准控制器类似),例如:
如果有人遇到同样的问题,请快速更新我的进度
有一件事我不知道,在没有我的帮助的情况下,如何让DI库实例化命令类,因此我实际上必须将容器本身注入我被重写的应用程序类中,并重写
getDefaultCommands()
,然后手动将实例从容器中拉出。不太理想,但现在必须这样做。我不知道你的问题是否仍然相关,但我有一个答案,因为我在这里偶然发现了同样的问题
您只需自己创建内核并将其交给\Symfony\Bundle\FrameworkBundle\Console\Application,该应用程序扩展了basic\Symfony\Component\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);
谢谢你的回答。如何构造应用程序对象以使上述代码段有效?当我尝试您的建议时,我遇到了一个问题中提到的错误(Application::getKernel()方法未找到)。这是有道理的,因为我构建的应用程序是Symfony\Component\Console\application的一个实例,它没有内核。您没有使用完整的堆栈框架吗?所以这很正常,您需要自己构建容器并将其注入到命令中。不,我不是!应用程序不够大,无法携带重炮。这就是问题所在。出于某种原因,文档对此非常模糊。因此,Symfony\Component\Console\Application不等于我们为自己创建的容器。查看这篇博文:鉴于您是S2新手,我建议您使用完整的框架来开始。让你的应用程序运行,并获得一些使用组件的经验。然后你可以试着把东西去掉。特别是如果您想要访问Doctrine 2 DBAL。它的配置有点麻烦。嗨,这里是PHP-DI的作者。下面是一个如何将其与Symfony控制台组件一起使用的示例(在Symfony框架之外):如果您有任何问题,请使用聊天中的php di
标记或标题在StackOverflow上询问它:感谢您提供的链接。好吧,我最终做了类似的事情,除了我一开始(甚至在集成DI之前)在应用程序类中创建了一些作为默认命令的命令。因此,为了继续沿着这条路径前进,我必须将容器注入到应用程序类中,并将命令实例拉到那里。目前还可以。