3

我想用实体Category集合Presentation(见下文)序列化为 JSON 实体以用于 REST API。

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

当数据集很小并且Category只有 5-10 个相关时Presentations,结果响应不会太大。但是,当Category开始让我们说 100 或 200 相关时Presentations,显然我不想返回所有这些,而是​​想“分页”结果,例如。调用端点时:

/api/v1/categories/1?page=2 - 只会返回“第二页”

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

甚至可以与offsetand一起使用limit

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


    // ...

}

附言。我知道,例如,如果我想始终获取集合的@VirtualProperty5 个元素,我可以添加 created并切片学说ArrayCollection,如下所示。但是这里的问题是我不能将偏移参数传递给这个方法。因为它会被 JMSSerializer 在某处内部调用......

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

1 回答 1

1

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

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

/api/v1/categories/1->没有演示的序列化类别

/api/v1/categories/1/presentations-> 演示文稿的序列化集合

在这里你应该使用分页

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

于 2016-02-22T07:13:13.580 回答