0

我是一名年轻的开发人员,我最近发现了Api-Platform来制作一个完整的 rest api。

目前,我正在关注文档,但我不明白如何通过示例获取一个人的所有书籍。

我在这里:

我自动生成了 Book 和 Person 实体,我只是在它们之间添加了 ManyToMany 关系。

然后我有以下结果:

得到api.platform.dev/app_dev.php/

{
    @context: "/app_dev.php/contexts/Entrypoint",
    @id: "/app_dev.php/",
    @type: "Entrypoint",
    person: "/app_dev.php/people",
    book: "/app_dev.php/books"
}

得到api.platform.dev/app_dev.php/people/3

{
    @context: "/app_dev.php/contexts/Person",
    @id: "/app_dev.php/people/3",
    @type: "http://schema.org/Person",
    birthDate: null,
    description: "test",
    gender: "Femme",
    name: "test",
    url: null,
    books: [
        "/app_dev.php/books/1",
        "/app_dev.php/books/4"
    ]
}

这是我的问题,我怎样才能在第二个结果中获得一个人所有书籍的超媒体,以及获得一个人的所有书籍的最佳选择是什么?

我已经开始创建我的自定义操作:

#services.yml
resource.person.item_operation.custom_get:
    class:   "Dunglas\ApiBundle\Api\Operation\Operation"
    public:  false
    factory:
        - "@api.operation_factory"
        - "createItemOperation"
    arguments:
        - "@resource.person"                  # Resource
        - ["GET"]                             # Methods
        - "/people/{id}/books"                # Path
        - "AppBundle:Person:custom"           # Controller
        - "my_custom_route2"                  # Route name
        - # Context (will be present in Hydra documentation)
            "@type":       "hydra:Operation"
            "hydra:title": "A custom operation"
            "returns":     "xmls:string"

// PersonController.php
<?php

namespace AppBundle\Controller;

use Dunglas\ApiBundle\Controller\ResourceController;
use Symfony\Component\HttpFoundation\Request;

class PersonController extends ResourceController
{
    public function customAction(Request $request, $id)
    {
        return parent::getAction($request, $id);
    }
}

GETapi.platform.dev/app_dev.php/people/3/books上的结果与基本相同api.platform.dev/app_dev.php/people/3,正常我打电话给父母。

但是现在拥有这样的东西的最好方法是什么:

# GET api.platform.dev/app_dev.php/people/3/books
{
    @context: "/app_dev.php/contexts/Book",
    @id: "/app_dev.php/people/3/books",
    @type: "hydra:PagedCollection",
    hydra:totalItems: 2,
    hydra:itemsPerPage: 30,
    hydra:firstPage: "/app_dev.php/people/3/books",
    hydra:lastPage: "/app_dev.php/people/3/books",
    hydra:member: [
        {
            @id: "/app_dev.php/books/1",
            @type: "http://schema.org/Book",
            illustrator: [ ],
            isbn: null,
            numberOfPages: 1230,
            author: [ ],
            datePublished: null,
            description: "Desription",
            genre: null,
            name: "someone",
            publisher: null
        },
        {
            @id: "/app_dev.php/books/2",
            @type: "http://schema.org/Book",
            illustrator: [ ],
            isbn: null,
            numberOfPages: 1230,
            author: [ ],
            datePublished: null,
            description: "Desription",
            genre: null,
            name: "someone",
            publisher: null
        }
    ]
}

当我得到api.platform.dev/app_dev.php/people/3这个 IRI/app_dev.php/people/3/books

谢谢你能给我的帮助。

4

1 回答 1

1

像这样创建子集合是可行的,但对于 API 平台的 v1 来说很复杂,因为它需要创建很多自定义类(使用 v2 会更容易)。

我建议使用以下结构:

GET /books?people=/people/3: 检索除人民 3 拥有的所有书籍

可以使用内置的 API 平台搜索过滤器轻松完成。

然后,如果您想要超媒体支持(顺便说一句,您真的需要它吗?我的意思是,您的客户端是否能够取消引用此类超媒体链接?),您需要创建一个自定义 Symfony 规范器来装饰API 平台提供的Dunglas\ApiBundle\JsonLd\Serializer\ItemNormalizer(服务)并添加一个该属性的api.json_ld.normalizer.item链接。/books?people=/people/3books

如果您仍想继续您开始的道路,您需要使用Dunglas\ApiBundle\Hydra\Serializer\CollectionNormalizerHydra 格式来规范您的收藏。您仍然可以装饰 ItemNormalizer 以指向您的自定义集合 URL。

我希望这会有所帮助。

于 2015-12-02T14:06:57.680 回答