如何使用JMS Serializer序列化ArrayCollection切片?

时间:2016-02-03 14:52:42

标签: php symfony serialization doctrine-orm jms-serializer

我希望序列化为JSON实体Category,其中包含Presentation个实体(见下文),以用于REST API。

端点看起来像这个/api/v1/categories/1

当数据集较小且Category仅有5-10个相关Presentations时,结果响应不会太大。然而,当Category开始让我们说100或200相关Presentations时,显然我不想返回所有这些,但是想要" paginate"结果,例如。在调用端点时:

/api/v1/categories/1?page=2 - 仅返回"第二页"

/api/v1/categories/1/page=3 - 将返回"第3页"

甚至可以与offsetlimit

一起使用

/api/v1/categories/1?offset=20&limit=10

但问题是:如何让JMS序列化程序仅序列化集合的一部分?

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
 */
class Category
{

    /**
     * @var string
     * @ORM\Column(type="string")
     * @JMS\Expose()
     * @JMS\Groups({"get-category"})
     */
    private $title;


    // ...

    /**
     * @var ArrayCollection
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Presentation", mappedBy="categories", fetch="EXTRA_LAZY")
     * @JMS\Groups({"get-category"})
     * @JMS\Expose()
     */
    private $presentations;


    // ...

}

PS。我知道,例如,如果我想要总是第一个 5个集合元素,我可以添加创建的@VirtualProperty并切割学说ArrayCollection,如下所示。但问题是我无法将偏移参数传递给此方法。因为JMSSerializer会在某处内部调用它......

/**
 * @JMS\VirtualProperty()
 *
 */
public function getFirstFivePresentations(){
    return $this->presentations->slice(0,5);
}

1 个答案:

答案 0 :(得分:0)

您正在尝试在REST API中实现不正确的方法。每个实体都必须拥有自己的路径。

正确的方法是有两个不同的端点:

rat_id rating_comment created_at id 18 superb developer 2016-02-19 18:26:54 82 9 james to manoj-joshi 2016-02-19 16:42:17 84 50 james to prem 2016-02-19 13:05:30 83 - >序列化类别没有演示文稿

/api/v1/categories/1 - >连续的展示集合

在这里你应该使用分页

/api/v1/categories/1/presentations