2015-04-22 26 views
2

如何從命令類獲得服務?我一直在試圖用ContainerAwareCommand作爲我的命令類的父,然後只用$this->getContainer()->get('my_service'),但是當我運行在CLI命令,我收到以下錯誤:從命令類獲取服務

調用未定義的方法Symfony\Component\Console\Application::getKernel()

ContainerAwareCommand類的getContainer()方法。

,通過它我運行該命令的文件是:

<?php 

    require_once __DIR__.'/../vendor/autoload.php'; 
    require_once __DIR__.'/AppKernel.php'; 

    use AppBundle\Console\Command\ChangeEmailCommand; 
    use Symfony\Component\Console\Application; 
    use Symfony\Component\Console\Input\ArgvInput; 
    use Symfony\Component\Debug\Debug; 

    $input = new ArgvInput(); 
    $env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev'); 
    $debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--no-debug', '')) && $env !== 'prod'; 

    if ($debug) { 
     Debug::enable(); 
    } 

    $kernel = new AppKernel($env, $debug); 
    $application = new Application($kernel); 
    $application->add(new ChangeEmailCommand()); 
    $application->run(); 
+0

您需要在您的電子郵件命令中調用setContainer。 – Cerad

回答

2

您必須使用FrameworkBundle的Application不是控制檯組件。該類擴展了Console組件中的一個,但增加了對Kernel和Container的認識。您的應用程序版本沒有這種意識(因爲它是爲Symfony上下文之外的獨立使用而設計的),導致「方法getKernel()不存在」。

所以更改此設置:

use Symfony\Component\Console\Application; 

要:

use Symfony\Bundle\FrameworkBundle\Console\Application; 

順便說一句,你通常不需要自己創建此文件。當您使用安裝程序/ composer create-project安裝Symfony時,您可以在標準版中使用app/consolehttps://github.com/symfony/symfony-standard/blob/2.7/app/console