从命令类获取服务

时间:2015-04-22 19:08:00

标签: php symfony command-line-interface

如何从命令类获取服务?我一直在尝试使用ContainerAwareCommand作为命令类的父级,然后只使用$this->getContainer()->get('my_service'),但是当我在cli中运行命令时,我收到以下错误:

调用未定义的方法Symfony\Component\Console\Application::getKernel()

getContainer()类的ContainerAwareCommand方法内。

我运行命令的文件是:

<?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();

1 个答案:

答案 0 :(得分:2)

您必须使用FrameworkBundle的Application而不是Console组件。此类扩展了Console组件中的类,但增加了对内核和Container的感知。您的应用程序版本没有这种意识(因为它是为Symfony上下文之外的独立使用而设计的),导致&#34;方法getKernel()不存在&#34;。

所以改变这个:

use Symfony\Component\Console\Application;

要:

use Symfony\Bundle\FrameworkBundle\Console\Application;

顺便说一下,通常你不需要自己创建这个文件。使用安装程序/ app/console安装Symfony时,您可以在标准版中使用composer create-projecthttps://github.com/symfony/symfony-standard/blob/2.7/app/console