首页 文章

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

提问于
浏览
2

我从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 => Object(Sermovi \ Bundle \ ManagementBundle \ Entity \ Transaction))) . ”,“class”:“LogicException”,“trace”: [{ “命名空间”: “”, “short_class”: “”, “类”: “”, “类型”: “”, “功能”: “”, “文件”:“/家/ tirengarfio /工作区/ sermovi /app/bootstrap.php.cache","line":2855,"args":[]},{"namespace":"Symfony\Component\HttpKernel","short_class":"HttpKernel","class “:” 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 \ DependencyInjection \ ContainerAwareHttpKernel“, ”类型“: ” - >“, ”功能“: ”处理“,”文件 “:”/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache”, “行”:2247, “ARGS”:[[ “对象”, “的Symfony \元器件\ HttpFoundation \请求”],[ “字符串”, “1”],[ “布尔”,真]]},{ “命名空间”: “的Symfony \元器件\ HttpKernel”, “short_class”: “内核”, “类”:“的Symfony \元器件\ HttpKernel \内核 “ ”类型“: ” - >“, ”功能“: ”处理“, ”文件“: ”/家/ tirengarfio /工作区/ sermovi /网络/ app_dev.php“, ”线“:28,” ARGS “:[[” 对象”, “的Symfony \元器件\ HttpFoundation \请求”]]}]}]

EDIT:

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

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

1 回答

  • 3

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

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

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

    use FOS\RestBundle\Controller\Annotations as Rest;
    //.....
    
    /**
    * @Rest\View()
    */
    public function cgetAction() {}
    

    您甚至可以通过设置控制器的方式来实现这一点,但我之前没有尝试过 . 如果你走那条路就行,请告诉我们 .

    UPDATE

    对于那些可能对不使用 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);
        }
    }
    

相关问题