组注释不起作用
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
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