Symfony - рамка на Api-платформа: Вземете всички елементи на потребител

Аз съм млад разработчик и наскоро открих Api-Platform, за да направя api за пълна почивка.

В момента следя документ, но не разбирам как да получите всички книги на човек като пример.

Ето ме:

Имам автоматично генерирани обекти Книга и Лице, просто добавям връзка 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

Благодаря ви за помощта, която можете да ми окажете.


person vincent_chapron    schedule 02.12.2015    source източник


Отговори (1)


Създаването на подколекции като тази е възможно, но е сложно с v1 на API платформата, тъй като изисква създаването на много персонализирани класове (ще бъде по-лесно с v2).

Това, което бих предложил, е да използвате следната структура:

GET /books?people=/people/3: извлечете всички книги, притежавани от хората 3

Може да се направи лесно с помощта на вградения филтър за търсене на API платформа.

След това, ако искате поддръжка на хипермедия (между другото наистина ли имате нужда от нея - имам предвид, може ли вашият клиент да дереферира такива хипермедийни връзки?), имате нужда от създайте персонализиран нормализатор на Symfony, като украсите Dunglas\ApiBundle\JsonLd\Serializer\ItemNormalizer (услуга api.json_ld.normalizer.item), предоставена от API Platform и добавите връзка към /books?people=/people/3 за свойството books .

Ако все още искате да следвате пътя, който сте започнали, трябва да използвате Dunglas\ApiBundle\Hydra\Serializer\CollectionNormalizer, за да нормализирате колекцията си във формата Hydra. Все още можете да украсите ItemNormalizer, за да сочи към URL адреса на персонализираната ви колекция.

Надявам се това да помогне.

person Kévin Dunglas    schedule 02.12.2015