组注释不起作用

Groups Annotations don't works

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

然后在我的 Article 实体中,我添加了带有正确使用语句的注释 @Groups({"article"})。

我得到的默认序列化器:

[
    [],
    []
]

Whit JMS 序列化程序(捆绑包)我得到:

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

(我在db里有两篇文章) 似乎无法识别 "article" 组。当我使用没有此注释的默认序列化程序时,我收到一个循环错误。

怎么了?

[编辑] 与

相同的行为
/**
 * @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;
} 

响应仍然是空的。

好的,我像这样使用 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')));
    }

现在组注释工作正常。

使用您建议的答案

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

returns JSON 对我来说是字符串。要解决您的问题,您的 config.yml 文件中必须包含以下内容:

jms_serializer:
  metadata:
    auto_detection: true

这就是它识别您在实体文件中使用注释指定的映射的方式。此处有更多信息:docs。有了它,您可以根据需要使用 @View(serializerGroups={"group"}) 注释。

P.S。交响乐 3.2.2; JMSSerializer 1.1; FOSRestBundle 2.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(http://symfony.com/doc/master/bundles/FOSRestBundle/3-listener-support.html, http://symfony.com/doc/master/bundles/FOSRestBundle/view_response_listener.html)中强制view_response_listener

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

应该可以!

尝试php bin/console cache:clear