组注释不起作用

时间:2016-12-06 15:29:22

标签: php rest serialization symfony fosrestbundle

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({“article”})。

我得到的Whit默认序列化器:

[
    [],
    []
]

Whit 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;
} 

答案仍然是空的。

4 个答案:

答案 0 :(得分: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')));
    }

现在群组注释工作正常。

答案 1 :(得分:2)

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

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

require 'rspec/rails'

有必要在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
framework:
    ....
    serializer: { enable_annotations: true }

这应该有用!

答案 2 :(得分: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

答案 3 :(得分:0)

尝试php bin/console cache:clear