我是一名年轻的开发人员,最近我发现Api-Platform可以完全休息。
目前,我正在关注doc,但我不明白如何通过示例获取所有人的书籍。
我在这里:
我自动生成了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);
}
}
GET api.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
感谢您给予我的帮助。
答案 0 :(得分:1)
创建像这样的子集合是可行的,但与API平台的v1很复杂,因为它需要创建大量的自定义类(使用v2会更容易)。
我建议使用以下结构:
GET /books?people=/people/3
:检索人民拥有的所有图书3
可以使用the builtin API Platform search filter轻松完成。
然后,如果你想要超媒体支持(顺便说一句,你真的需要吗 - 我的意思是,你的客户能够取消引用这样的超媒体链接吗?),你需要create a custom Symfony normalizer装饰Dunglas\ApiBundle\JsonLd\Serializer\ItemNormalizer
(服务api.json_ld.normalizer.item
)由API平台提供,并为/books?people=/people/3
媒体资源添加books
的链接。
如果您仍想继续沿着您开始的道路前进,您需要使用Dunglas\ApiBundle\Hydra\Serializer\CollectionNormalizer
来按照Hydra格式规范化您的收藏。您仍然可以装饰ItemNormalizer以指向您的自定义集合URL。
我希望这有帮助。