FOSRestBundle:控制器必须返回给定的响应(Array())

时间:2013-12-19 18:20:33

标签: symfony fosrestbundle

我从FOSRestBundle开始。我添加了这个路由配置:

//Sermovi/Bundle/APIBundle/Resources/config/routing.yml    
sermovi_api_homepage:
        type: rest
        resource: Sermovi\Bundle\APIBundle\Controller\DefaultController

//app/config/routing.yml     
sermovi_api:
    type: rest
    prefix:   /api
    resource: "@SermoviAPIBundle/Resources/config/routing.yml"

这个config.yml

fos_rest:
    routing_loader:
        default_format: json
    view:
        view_response_listener: true

sensio_framework_extra:
    view:
        annotations: false

这个控制器:

namespace Sermovi\Bundle\APIBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\FOSRestController;
use Symfony\Component\HttpFoundation\Response;


class DefaultController extends FOSRestController
{
    public function getArticlesAction()
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('SermoviManagementBundle:Transaction')->find(776);

        return array(
            'entity' => $entity
        );
    }
}

我收到了这个错误:

  

[{“message”:“控制器必须返回响应(Array(entity =>   对象(Sermovi \包\ ManagementBundle \实体\事务))   定) “” 类 “:” LogicException”, “跟踪”:[{ “命名空间”: “”, “short_class”: “”, “类”: “”, “类型”: “”, “功能” : “”, “文件”: “/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache”, “行”:2855, “ARGS”:[]},{ “命名空间”:“的Symfony \元器件\ HttpKernel “ ”short_class“: ”HttpKernel“, ”类“: ”的Symfony \元器件\ HttpKernel \ HttpKernel“, ”类型“: ” - >“ 中, ”功能“: ”handleRaw“, ”文件“:”/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache “ ”行“:2817, ”ARGS“:[[ ”对象“, ”的Symfony \元器件\ HttpFoundation \请求“],[ ”字符串“,” 1 “]]},{” 命名空间 “:” 的Symfony \元器件\ HttpKernel”, “short_class”: “HttpKernel”, “类”: “的Symfony \元器件\ HttpKernel \ HttpKernel”, “类型”: “ - >” 中, “功能”: “处理”, “文件”: “/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache”, “行”:2946, “ARGS”:[[ “对象”,“的Symfony \组件\ HttpFoundation \请求 “],[” 字符串 “ ”1“],[ ”布尔“,真]]},{ ”命名空间“: ”的Symfony \元器件\ HttpKernel \ DependencyInjection“, ”short_class“:” ContainerAwareHttpKernel “ ”阶级“:” Symfony的\分量\ HttpKernel \德pendencyInjection \ ContainerAwareHttpKernel”, “类型”: “ - >” 中, “功能”: “处理”, “文件”: “/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache”, “行”: 2247, “ARGS”:[[ “对象”, “的Symfony \元器件\ HttpFoundation \请求”],[ “字符串”, “1”],[ “布尔”,真]]},{ “命名空间”:“的Symfony \组件\ HttpKernel”, “short_class”: “内核”, “类”: “的Symfony \元器件\ HttpKernel \内核”, “类型”: “ - >” 中, “功能”: “处理”, “文件”: “/home/tirengarfio/workspace/sermovi/web/app_dev.php","line":28,"args":[["object","Symfony\Component\HttpFoundation\Request"]]}]}]

编辑:

“可能”我会在下面做这样的事情吗?或者由于FOSRestBundle正在使用JMSSerializerBundle,我不应该这样做?

$serializedEntity = $this->container->get('serializer')->serialize($entity, 'json');
return new Response($serializedEntity);

1 个答案:

答案 0 :(得分:4)

有几种方法可以使用FOSRestBundle设置控制器。你这样做的方式,你必须返回一个视图。这是一个指向github上的休息控制器的链接,可能会帮助你。 LiipHelloBundle有一个例子。

另外,我发现在我的控制器中使用ClassResourceInterface最容易。这样,我返回一个数组,它处理所有序列化本身。它还使用您的Controller名称生成必要的路由,因此我不必手动定义任何路由。这是我设置Controller的首选方式。有关其工作原理,请参阅文档条目here

如果您最终使用ClassResourceInterface,请确保为每个操作都包含以下注释,它将使您返回的数组正确序列化:

use FOS\RestBundle\Controller\Annotations as Rest;
//.....

/**
* @Rest\View()
*/
public function cgetAction() {}

您甚至可以通过设置控制器的方式来实现这一点,但我之前没有尝试过。如果你这样做,请告诉我们它是否有效。

<强>更新

对于那些可能对不使用ClassResourceInterface而使用FOSRestBundle感兴趣的人,问题中控制器操作的问题是它不返回视图。这应该在行动中起作用:

class DefaultController extends FOSRestController
{
    public function getArticlesAction()
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('SermoviManagementBundle:Transaction')->find(776);
        $statusCode = 200;

        $view = $this->view($entity, $statusCode);
        return $this->handleView($view);
    }
}