1

AngularJs アプリ用の Api-Platform を使用して、最初の REST API を構築しています。

ここで juste のようなすべての Project エンティティを取得したい (私の URL /projects を使用):

{
  "@context": "/contexts/Project",
  "@id": "/projects",
  "@type": "hydra:PagedCollection",
  "hydra:totalItems": 19,
  "hydra:itemsPerPage": 30,
  "hydra:firstPage": "/projects",
  "hydra:lastPage": "/projects",
  "hydra:member": [
    {
      "@id": "/projects/1",
      "@type": "Project",
      "name": "test1",
      "parent": null,
      "createdAt": "2014-12-22T11:38:13+01:00",
      "updatedAt": null,
      "deletedAt": null
    },
    {
      "@id": "/projects/2",
      "@type": "Project",
      "name": "test2",
      "parent": null,
      "createdAt": "2014-12-22T17:02:50+01:00",
      "updatedAt": null,
      "deletedAt": null
    },
    {
      "@id": "/projects/3",
      "@type": "Project",
      "name": "test3",
      "parent": "/projects/2",
      "createdAt": "2014-12-22T18:28:50+01:00",
      "updatedAt": null,
      "deletedAt": null
    }
  ]
}

しかし、ご覧のとおり、私のプロジェクトは親を持つことができるので、親プロジェクトの参照を取得しました (この /projects/2 のように)

このように参照する代わりに、Json でプロジェクト オブジェクトを直接取得できますか?

    {
        "@id": "/projects/3",
        "@type": "Project",
        "name": "test3",
        "parent": {
            "@id": "/projects/2",
            "@type": "Project",
            "name": "test2",
            "parent": null,
            "createdAt": "2014-12-22T17:02:50+01:00",
            "updatedAt": null,
            "deletedAt": null
        },
        "createdAt": "2014-12-22T18:28:50+01:00",
        "updatedAt": null,
        "deletedAt": null
    }

これは、Rest APi の優れた実用例ですか?

4

1 に答える 1

0

API Platform には、親 JSON ドキュメントにリレーションを埋め込むための組み込み関数があります。

エンティティは次のようになります。

namespace AppBundle\Entity;

use Symfony\Component\Serializer\Annotation\Groups;

class Project
{
   private $id;

   /** @Groups({"embed"}) */
   private $parent;

   /** @Groups({"embed"}) */
   private $name;

   /** @Groups({"embed"}) */
   private $createdAt;

   // ...
}

そしてサービス定義:

# app/config/services.yml
services:
    # ...

    resource.offer:
        parent:    api.resource
        arguments: [ 'AppBundle\Entity\Offer' ]
        calls:
            -      method:    initNormalizationContext
                   arguments: [ { groups: [ embed ] } ]
        tags:      [ { name: api.resource } ]

親の親だけでなく、親の親なども埋め込まれます。これを変更する場合は、カスタム ノーマライザーを作成する必要があります。新しい@MaxDepth注釈のおかげで、Symfony 3.1 がリリースされると、より簡単になります。

于 2016-02-01T23:24:37.097 に答える