控制器必须返回响应

时间:2012-01-30 11:26:31

标签: symfony

这是我的控制者:

    /**
 * Finds and displays a Formacion entity.
 *
 * @Route("/{id}/show", name="curso_show")
 * @Template()
 */
public function showAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();

    $curso = $em->getRepository('GitekUdaBundle:Curso')->find($id);

    if (!$curso) {
        throw $this->createNotFoundException('Unable to find Curso entity.');
    }

    $deleteForm = $this->createDeleteForm($id);             

    // Detalle Formación
    $detcurso = new Detcurso();
    $formdetcurso   = $this->createForm(new DetcursoType(), $detcurso);

    return array(
        'curso'      => $curso,
        'delete_form' => $deleteForm->createView(),  
        'detcurso'      => $detcurso,
        'formdetcurso' => $formdetcurso,
        );
}

在我的开发环境中工作得很好(Mac)但是当我去我的生产环境(CentOS服务器)时我得到了

The controller must return a response (Array(curso => Object(Gitek\UdaBundle\Entity\Curso), delete_form => Object(Symfony\Component\Form\FormView), detcurso => Object(Gitek\UdaBundle\Entity\Detcurso), formdetcurso => Object(Symfony\Component\Form\Form)) given).

500内部服务器错误 - LogicException

有任何线索吗?

7 个答案:

答案 0 :(得分:47)

答案 1 :(得分:19)

Symfony2期望从控制器操作返回Response对象。我猜你可能想要以下内容:

return $this->render(
    "YourBundlePath:Something:template.html.twig",
    array(
        'curso'        => $curso,
        'delete_form'  => $deleteForm->createView(),  
        'detcurso'     => $detcurso,
        'formdetcurso' => $formdetcurso,
    )
);

$this->render()方法将呈现提供的模板名称,在上面的示例中,将模板传递给您的参数数组。它会将这个生成的内容包装在一个Response对象中,这正是Symfony2所期望的。

您也可以直接返回一个新的Response对象,例如return new Response('Hello, world'),如果需要。

有关详细信息,请参阅the documentation

答案 2 :(得分:5)

我也遇到了这个问题,这篇帖子离我的问题最近,但没有解决,所以我想在这里写一下我的解决方案,万一有些人也遇到了我的问题。

似乎模板注释存在问题,就像上面有人说的那样,你可以使用渲染函数来解决问题,但我认为这不是一个好的解决方案,因为@template注释试图让这个模板更容易管理默认情况下在symfony crud生成器中使用。

所以,我的问题是我安装了FosRestBundle,并且在安装它时我必须通过将这些行添加到config.yml来禁用模板注释:

#The view_annotations flag must be false to work with FOSRestBundle
sensio_framework_extra:
    view:
        annotations: false   

您必须删除这些行以使@template注释再次起作用。这很奇怪,因为我在完成最后一个作曲家更新之后才遇到这个问题,但之前没有。

这是跟随捆绑安装文档而不了解你在做什么的问题^ _ ^!

希望这有助于某人

答案 3 :(得分:3)

更新您的配置文件

sensio_framework_extra:
   view:
      annotations: true

答案 4 :(得分:1)

正如Kox和Inori在评论中所说,返回$ this->渲染不是解决方案,而是简单地避免问题。

有两种可能性:

  • 未导入模板注释。你有使用声明吗?
  • 模板在生产中未知。 CaseSensitive问题? CentO区分大小写,而Mac OS和Windows则不区分大小写。 templateTemplate不一样。
  • 未导入模板。你最近在生产模式上运行了bin vendors/update吗?

答案 5 :(得分:0)

我刚刚在部署后遇到了同样的问题并且必须清除我的缓存才能让symfony2注意我最近添加的@Template注释(从$ this-> render()切换)。在尝试此操作之前,请确保您已清除生产缓存。

从你的symfony目录: php app / console cache:clear --no-warmup --env = prod

答案 6 :(得分:0)

只需将以下内容添加到控制器顶部:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;