2015-12-02 72 views
0

我是一名年轻开发人员,最近我发现Api-Platform作出完整的休息api。Symfony - Api平台框架:获取用户的所有项目

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

我在这里:

我有书和人单位自动生成的,我只需添加它们之间的多对多关系。

然后,我有以下结果:

GET 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" 
} 

GET 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" 

和GET api.platform.dev/app_dev.php/people/3/books

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

结果是一样的基本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

感谢你,你可以给我的帮助。

回答

1

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

我的建议是用以下结构:

GET /books?people=/people/3:检索BU人3

它可以很容易地使用the builtin API Platform search filter完成所拥有的所有书籍。

然后,如果你想超媒体的支持(顺便说一句,你真的需要它 - 我的意思是,你的客户能够解引用这种超媒体链接?),你需要可以create a custom Symfony normalizer装饰通过API平台和提供的Dunglas\ApiBundle\JsonLd\Serializer\ItemNormalizer(服务api.json_ld.normalizer.item)为books属性添加链接到/books?people=/people/3

如果您仍然想要遵循您开始的道路,则需要使用Dunglas\ApiBundle\Hydra\Serializer\CollectionNormalizer以Hydra格式规范您的馆藏。您仍然可以修饰ItemNormalizer以指向您的自定义集合URL。

我希望这个帮助。