Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony控制台应用程序:依赖项注入_Php_Symfony_Dependency Injection_Dbal - Fatal编程技术网

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

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(

这里有一个Symfony新手。在阅读了一些Symfony文档和这里的一些答案之后,我现在几乎完全困惑了。 我正在尝试使用console应用程序组件并创建一个小型的db感知控制台应用程序

<?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()
方法使用。(与标准控制器类似),例如:


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

  • 我在我的项目中加入了PHP-DI依赖项注入框架,该框架在没有配置的情况下(到目前为止)运行得相当好——实际上,它通过反射得到了相当多的结果
  • 同样,Doctrine\DBAL作为一个独立的库包含(我反对它的O/RM部分,因为它实际上是一个很小的项目,而且我对SQL的支持比其他任何东西都要坚定得多),连接只是由一个连接提供程序返回,该连接提供程序在DI需要的地方注入

  • 有一件事我不知道,在没有我的帮助的情况下,如何让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之前)在应用程序类中创建了一些作为默认命令的命令。因此,为了继续沿着这条路径前进,我必须将容器注入到应用程序类中,并将命令实例拉到那里。目前还可以。