2016-12-06 113 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' 

這應該工作!