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']