2015-12-02 41 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。

我希望這個幫助。