2016-12-06 121 views
2

Symfony的3.1.7 + FOSRestBundle最新版本组注释不会工作

<?php 
namespace PM\ApiBundle\Controller; 

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

class ArticlesController extends FOSRestController 
{ 
    /** 
    * @ApiDoc(
    * section="articles", 
    * resource=true, 
    * description="Get articles published" 
    *) 
    * @Rest\View(serializerGroups={"article"}) 
    * @Rest\Get("/articles") 
    */ 
    public function getArticlesAction(Request $request) 
    { 
     $articles = $this->getDoctrine() 
      ->getManager() 
      ->getRepository('PMPlatformBundle:Article') 
      ->findAllDateDesc(); 
     /* @var $articles Article[] */ 
     return $articles; 
    } 

然后在我的文章实体添加此注释@Groups({“文章”})与使用权声明。

白衣默认的序列获得:

[ 
    [], 
    [] 
] 

白衣JMS串行器(束)我得到:

{ 
    "0": {}, 
    "1": {} 
} 

(我在DB的两篇文章) 看起来像 “文章” 组不被认可。当我使用缺省的序列化程序而没有这个注释时,我得到一个循环错误。

怎么了?

[编辑]相同的行为与

/** 
* @ApiDoc(
* section="articles", 
* resource=true, 
* description="Get articles published" 
*) 
* @Rest\View() 
* @Rest\Get("/articles") 
*/ 
public function getArticlesAction(Request $request) 
{ 
    $context = new Context(); 
    $context->addGroup('article'); 

    $articles = $this->getDoctrine() 
     ->getManager() 
     ->getRepository('PMPlatformBundle:Article') 
     ->findAllDateDesc(); 
    /* @var $articles Article[] */ 
    $view = $this->view($articles, 200); 
    $view->setContext($context); 

    return $view; 
} 

的响应仍然是空的。

+0

请问您可以告诉我们您的findAllDateDesc()方法返回的内容(var_dump或print_r)/您可以粘贴您的实体或序列器配置的代码吗? –

+0

我的方法findAllDateDesc()工作正常(和debbuging,上帝!不使用var_dump或print_r,personnaly我使用xdebug ..),我的实体在这里不是问题,序列化程序也是。我回答了我的问题,我使用JMS序列化程序修复了这个问题。任何方式感谢您的帮助! –

回答

2

好吧我固定它使用JMS串行这样的:

use JMS\Serializer\SerializationContext; 
use JMS\Serializer\SerializerBuilder; 


class ArticlesController extends FOSRestController 
{ 
    /** 
    * @ApiDoc(
    * section="articles", 
    * resource=true, 
    * description="Get articles published" 
    *) 
    * @Rest\View() 
    * @Rest\Get("/articles") 
    */ 
    public function getArticlesAction(Request $request) 
    { 
     $serializer = SerializerBuilder::create()->build(); 

     $articles = $this->getDoctrine() 
      ->getManager() 
      ->getRepository('PMPlatformBundle:Article') 
      ->findAllDateDesc(); 
     /* @var $articles Article[] */ 


     return $serializer->serialize($articles, 'json', SerializationContext::create()->setGroups(array('article'))); 
    } 

现在组注释工作正常。

+0

你可以通过$ serializer = $ this-> get('jms_serializer.serializer')获得jmsSerializer服务 – Arno

0

使用你所建议的答案

$serializer = SerializerBuilder::create()->build(); 
return $serializer->serialize($collection, 'json', SerializationContext::create()->setGroups(['group'])); 

返回JSON作为字符串给我。为了解决你的问题,你必须在你的config.yml文件中的以下内容:

jms_serializer: 
    metadata: 
    auto_detection: true 

这是如何识别您在实体文件注解指定映射。更多的信息在这里:docs。如此,您可以根据需要使用@View(serializerGroups={"group"})注释。

P.S. Symfony 3.2.2; JMSSerializer 1.1; FOSRestBundle 2.1

1

您可以保留symfony的默认序列化程序。不需要JMSSerializer。

你可能忘了激活序列化的注释中config.yml(https://symfony.com/doc/current/serializer.html#using-serialization-groups-annotations

#app/config/config.yml 
framework: 
    .... 
    serializer: { enable_annotations: true } 

是必要的强制config.yml的view_response_listener(http://symfony.com/doc/master/bundles/FOSRestBundle/3-listener-support.htmlhttp://symfony.com/doc/master/bundles/FOSRestBundle/view_response_listener.html

#app/config/config.yml 
fos_rest: 
    view: 
     view_response_listener: 'force' 

这应该工作!