首页 文章

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

提问于
浏览
4

这是一个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 回答

  • 3

    如果有人遇到同样的问题,只需快速更新我的进度 .

    • 我在我的项目中加入了PHP-DI依赖注入框架,它似乎在没有配置的情况下运行得相当好(到目前为止) - 它实际上通过反射得出了很多 .

    • 同样的方式,Doctrine \ DBAL作为一个独立的库包含在内(我选择了它的O / RM部分,因为它实际上是一个很小的项目,而且我在SQL上比其他任何东西都要坚定得多)和连接提供者只需返回连接,该连接提供者在DI需要的地方注入 .

    我无法弄清楚的一件事是如何在没有我帮助的情况下让DI库实例化命令类,所以我实际上必须将容器本身注入我重写的应用程序类并覆盖 getDefaultCommands() 然后我将实例拉出容器手动 . 不理想,但现在必须做 .

  • 0

    如果你的命令扩展 ContainerAwareCommand

    ...
    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    ...
    
    class MyCommand extends ContainerAwareCommand
    {
    

    DI容器可以使用 getContainer() 方法 . (比如在标准控制器中),例如:

    $this->validator = $this->getContainer()->get('validator');
    
  • 1

    我不知道你的问题是否仍然相关,但我有一个答案,因为我偶然发现了同样的问题 .

    您只需自己创建内核并将其提供给扩展基本\ 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);
    

相关问题