我正在尝试使用@Groups
注释来序列化我的数据,但我只是收到一个空数组。
我尝试在我想要显示的字段上使用@Serializer\Expose
,但随后它们出现在所有地方并忽略这些组。
根据我的阅读,我非常确定我只需要使用@Groups
注释,但我最终会得到这个(有两个计划实体):
{
"schedules": [
{},
{}
]
}
似乎有一个改变,它应该如何工作,我已经找到了以前的版本FOSRestBundle的例子,我只是无法将它们移植到新版本。
根据我的理解,您可以在序列化程序上下文中设置组并使用它来设置视图上下文,但我没有运气。
https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/UPGRADING-2.0.md
已删除View :: setSerializationContext和View :: getSerializationContext。请改用View :: setContext和View :: getContext以及新的Context类。
在:
use JMS\Serializer\SerializationContext; $view = new View(); $context = new SerializationContext(); $view->setSerializationContext($context); $context = $view->getSerializationContext();
后:
use FOS\RestBundle\Context\Context; $view = new View(); $context = new Context(); $view->setContext($context); $context = $view->getContext();
我有一段时间了解这一切,并且非常感谢任何协助指出我正确的方向。
以下我尝试use FOS\RestBundle\Controller\Annotations as Rest;
和。{
使用控制器上的@Rest\View(serializerGroups({"schedule"})
注释,它与我现在看到的效果相同(即无)。
计划控制器
use FOS\RestBundle\Context\Context;
class ScheduleController extends BaseController
{
/**
* @param $date
* @return \Symfony\Component\HttpFoundation\Response
*/
public function getSchedulesScheduleAction($date)
{
$em = $this->getDoctrine()->getManager();
list($startDate, $endDate) = $this->get('radio.utils.date_and_time')->findWeekRange($date);
$schedules = $em->getRepository('RadioBundle:Schedule')->findByRange($startDate, $endDate);
$view = $this->view(
[
'schedules' => $schedules,
],
200
);
$context = new Context();
$context->setGroups(["schedule"]);
$view->setContext($context);
return $this->handleView($view);
}
}
安排实体
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use JMS\Serializer\Annotation as Serializer;
/**
* Schedule
*
* @ORM\Table(name="schedule")
* @ORM\Entity(repositoryClass="RadioBundle\Repository\ScheduleRepository")
* @Serializer\ExclusionPolicy("all")
*/
class Schedule
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \DateTime
* @Assert\NotBlank()
* @Serializer\Groups({"schedule"})
* @ORM\Column(name="start_time", type="datetime")
\ */
private $startTime;
/**
* @var \DateTime
* @Assert\NotBlank()
* @Serializer\Groups({"schedule"})
* @ORM\Column(name="end_time", type="datetime")
*/
private $endTime;
/**
* @Assert\NotBlank()
* @Serializer\Groups({"schedule"})
* @ORM\ManyToOne(targetEntity="RadioBundle\Entity\RadioShow", inversedBy="schedule")
*/
private $radioShow;
...
应用程序/ config.yml
fos_rest:
param_fetcher_listener: true
body_listener: true
format_listener: true
view:
view_response_listener: 'force'
routing_loader:
default_format: json
jms_serializer:
metadata:
auto_detection: true
答案 0 :(得分:3)
在实体上使用ExclusionPolicy(“all”),您需要使用组公开属性。
E.g。
/**
* @var \DateTime
* @Assert\NotBlank()
* @Serializer\Groups({"schedule"})
* @Serializer\Expose()
* @ORM\Column(name="start_time", type="datetime")
*/
private $startTime;