Symfony 从控制器调用命令无效

Symfony 从控制器调用命令无效,symfony,Symfony,我有这段代码来从控制器运行模式更新命令,我从控制器获得了帮助 我有以下代码: namespace AdminBundle\Controller; use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Co

我有这段代码来从控制器运行模式更新命令,我从控制器获得了帮助 我有以下代码:

namespace AdminBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class DefaultController extends Controller
{
    /**
     * @Route("/admin")
     */
    public function indexAction(KernelInterface $kernel)
    {
        $application = new Application($kernal);

        $input = new ArrayInput(array(
            'command' => 'doctrine:schema:update'
        ));

        $output = new NullOutput();
        $application->run($input, $output);

        return new Response("");
    }
}
这对我不起作用我打开此url后出现此错误:

我该怎么做?

与其将KernelInterface$kernel直接注入到您的操作中,不如直接调用您的容器询问内核:

公共函数指数化 { $kernel=$this->get'kernel'; $application=newapplication$kernel;//顺便说一句:$kernal与$kernel之间有一个输入错误 $input=新阵列输入阵列 '命令'=>'原则:架构:更新' ; $output=新的空输出; $application->run$input$output; //提示:使用204“无内容”表示成功,并为空 返回新的响应,204; } 与其将KernelInterface$kernel直接注入到您的操作中,不如直接调用容器询问内核:

公共函数指数化 { $kernel=$this->get'kernel'; $application=newapplication$kernel;//顺便说一句:$kernal与$kernel之间有一个输入错误 $input=新阵列输入阵列 '命令'=>'原则:架构:更新' ; $output=新的空输出; $application->run$input$output; //提示:使用204“无内容”表示成功,并为空 返回新的响应,204; }
虽然Michael的答案有效,但它不是Symfony 3.3中的首选方法,Symfony 3.3对其进行了几处更改。在对服务配置进行一些更改后,您的代码实际上可以正常工作

正如文档所述,依赖项注入容器在Symfony 3.3中发生了更改,默认情况下:

这允许您通过控制器操作方法中的参数自动连接内核,就像您尝试的那样。您的AppBundle无法工作的原因是,您的AdminBundle可能没有按照默认情况下在app/config/services.yml中设置AppBundle的方式进行设置。为了以Symfony 3.3希望的方式真正解决此问题,您应该向服务配置中添加AdminBundle,如下所示:

# app/config/services.yml
services:
    # add this below your AppBundle\Controller definition
    AdminBundle\Controller\:
        resource: '../../src/AdminBundle/Controller'
        public: true
        tags: ['controller.service_arguments']
这样,您就不必再调用$this->get'kernel';,您的原始代码将按您现有的方式工作,使用KernelInterface作为操作方法的参数

此外,您可以扩展新的而不是常规的控制器,然后调用$this->get将不再有效,这就是Symfony的方式


因此,尽管Michael的答案很有效,但我还是建议您实施我给出的答案,因为Symfony 3.3更倾向于继续使用该方法。

虽然Michael的答案有效,但它不是Symfony 3.3中的首选方法,Symfony 3.3对其进行了几处更改。在对服务配置进行一些更改后,您的代码实际上可以正常工作

正如文档所述,依赖项注入容器在Symfony 3.3中发生了更改,默认情况下:

这允许您通过控制器操作方法中的参数自动连接内核,就像您尝试的那样。您的AppBundle无法工作的原因是,您的AdminBundle可能没有按照默认情况下在app/config/services.yml中设置AppBundle的方式进行设置。为了以Symfony 3.3希望的方式真正解决此问题,您应该向服务配置中添加AdminBundle,如下所示:

# app/config/services.yml
services:
    # add this below your AppBundle\Controller definition
    AdminBundle\Controller\:
        resource: '../../src/AdminBundle/Controller'
        public: true
        tags: ['controller.service_arguments']
这样,您就不必再调用$this->get'kernel';,您的原始代码将按您现有的方式工作,使用KernelInterface作为操作方法的参数

此外,您可以扩展新的而不是常规的控制器,然后调用$this->get将不再有效,这就是Symfony的方式


因此,尽管Michael的答案很好用,但我还是建议您实施我给出的答案,因为Symfony 3.3更倾向于采用这种方法。

您使用的Symfony版本是什么?@DanCostinel版本3.3.5这不是事情不起作用的原因,但是您的控制器操作中有一个输入错误,使用$kernal而不是$kernel。我该怎么办?您是否从以前的Symfony版本升级到了3.3?您可能缺少配置参数您使用的是哪个symfony版本?@DanCostinel version 3.3.5这并不是事情不起作用的原因,但是您的控制器操作中有一个输入错误,并且使用$kernal而不是$kernel。我该怎么办?您是否从以前的symfony版本升级到了3.3?您可能也缺少正确的配置参数。但是,由于作者没有提供Symfony的版本,我建议了一个答案,这个答案从2.3开始生效:-是的,两个都很好:他后来在评论中添加了这个版本,所以我提供了另一个版本。这也是正确的。但是由于作者没有提供Symfony的版本,我提出了一个答案,这个答案从2.3开始生效:-是的,两个都很好:他后来在评论中添加了这个版本,这就是我提供替代方案的原因。Symfony 3.4文档中提到了使用$application
on->setAutoExitfalse;。。。我不知道这是否有任何必要,但我们的回购协议是由以前的开发人员从2.8升级而来的。此外,无论我为响应内容输入了什么,尽管命令确实运行,页面仍返回空白。这是我们回购协议中的另一个谜团,它在许多地方的表现与文档中所说的不一样,可能是因为开发人员在某些地方偏离了他们自己喜欢的定制。关于这一点的Symfony 3.4文档——提到使用$application->setAutoExitfalse;。。。我不知道这是否有任何必要,但我们的回购协议是由以前的开发人员从2.8升级而来的。此外,无论我为响应内容输入了什么,尽管命令确实运行,页面仍返回空白。这是我们回购协议中的另一个谜团,在许多地方,它的行为不像文档中所说的那样,可能是由于开发人员在某些地方偏离了他们自己喜欢的定制。
# app/config/services.yml
services:
    # add this below your AppBundle\Controller definition
    AdminBundle\Controller\:
        resource: '../../src/AdminBundle/Controller'
        public: true
        tags: ['controller.service_arguments']