将 @Groups 注释与 JMS Serializer 和 FOSRestBundle v2.1 一起使用时的空 JSON 数组

Sar*_*oma 0 symfony doctrine-orm fosrestbundle jmsserializerbundle

我正在尝试使用@Groups注释来序列化我的数据,但我只是收到一个空数组。

我试过@Serializer\Expose在我想显示的字段上使用,但随后它们随处可见而忽略了这些组。

从我读过的内容来看,我很确定我应该只需要使用@Groups注释,但我最终得到了这个(有两个计划实体):

{
  "schedules": [
    {},
    {}
  ]
}
Run Code Online (Sandbox Code Playgroud)

它的工作方式似乎发生了变化,我找到了以前版本 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();
Run Code Online (Sandbox Code Playgroud)

后:

use FOS\RestBundle\Context\Context;

$view = new View();
$context = new Context();
$view->setContext($context);
$context = $view->getContext();
Run Code Online (Sandbox Code Playgroud)

我花了很长时间来解决所有这些问题,并且非常感谢任何帮助为我指明正确方向的帮助。

除了下面我试图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);
    }
}
Run Code Online (Sandbox Code Playgroud)

调度实体

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;

    ...
Run Code Online (Sandbox Code Playgroud)

应用程序/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
Run Code Online (Sandbox Code Playgroud)

Ric*_*ard 5

在实体上使用 ExclusionPolicy("all") 时,您需要向组公开该属性。

例如

   /**
     * @var \DateTime
     * @Assert\NotBlank()
     * @Serializer\Groups({"schedule"})
     * @Serializer\Expose()
     * @ORM\Column(name="start_time", type="datetime")
     */
    private $startTime;
Run Code Online (Sandbox Code Playgroud)