Php 从命令类获取服务

Php 从命令类获取服务,php,symfony,command-line-interface,Php,Symfony,Command Line Interface,如何从命令类获取服务?我一直试图使用containerawarecomand作为我的命令类的父级,然后只使用$this->getContainer()->get('my_service'),但是当我在cli中运行该命令时,出现以下错误: 调用未定义的方法Symfony\Component\Console\Application::getKernel() 在ContainerWareCommand类的getContainer()方法中 我运行命令的文件是: <?php requir

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

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

ContainerWareCommand
类的
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();

您必须使用FrameworkBundle的
应用程序,而不是控制台组件。这个类扩展了控制台组件中的类,但是增加了对内核和容器的感知。您的应用程序版本没有这种意识(因为它是为独立使用而设计的,在Symfony上下文之外),导致“方法getKernel()不存在”

因此,改变这一点:

use Symfony\Component\Console\Application;
致:



顺便说一句,通常你不需要自己创建这个文件。您只需在标准版中使用
app/console
:当您使用安装程序安装Symfony/
composer create project

时,您需要在电子邮件命令中调用setContainer。
use Symfony\Bundle\FrameworkBundle\Console\Application;