Как отобразить вложенные документы в платформе API - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь отобразить вложенные документы по умолчанию, то есть, когда я запрашиваю API, он должен вернуть документы с их связями.

Два моих лица:

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use App\Traits\TimestampableTrait;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\ClaimRepository")
 * @ORM\Table("claims")
 */
class Claim
{
    use TimestampableTrait;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Activity", mappedBy="claim", cascade={"persist", "remove"})
     */
    private $activities;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\ClaimState", inversedBy="claims", cascade={"persist", "remove"})
     * @ORM\OrderBy({"id" = "desc"})
     */
    private $states;

А другой:

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use App\Traits\TimestampableTrait;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\ActivityRepository")
 * @ORM\Table("activities")
 */
class Activity
{
    use TimestampableTrait;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Claim", inversedBy="activities")
     */
    private $claim;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Invoice", mappedBy="activity", orphanRemoval=true, cascade={"persist","remove"})
     */
    private $invoices;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ActivityError", mappedBy="activity", cascade={"persist","remove"})
     */
    private $errors;

Когда я делаю GET /claims, я бы хотел, чтобы он отобразил отношения Activity со всеми свойствами, и сейчас я получаю:

{
  "data": {
    "id": "/claims/7",
    "type": "Claim",
    "attributes": {
      "_id": 7,
      "name": "My Valid Claim",
      "created": "2019-01-07T15:14:21+01:00",
      "updated": "2019-01-07T15:14:21+01:00"
    },
    "relationships": {
      "activities": {
        "data": [
          {
            "type": "Activity",
            "id": "/activities/7"
          }
        ]
      }
    }
  }
}

Я бы хотел получить что-то вроде этого:

{
  "data": {
    "id": "/claims/7",
    "type": "Claim",
    "attributes": {
      "_id": 7,
      "name": "My Valid Claim",
      "created": "2019-01-07T15:14:21+01:00",
      "updated": "2019-01-07T15:14:21+01:00"
    },
    "relationships": {
      "activities": {
        "data": [
          {
            "type": "Activity",
            "id": "/activities/7",
            "attributes": {
              "_id": 7,
              "name": "Activity no. 1",
              "created": "2019-01-07T15:14:21+01:00",
              "updated": "2019-01-07T15:14:21+01:00"
            },
            "relationships": {
              "invoices": {
                "data": [
                  {
                    "type": "Invoice",
                    "id": "/invoices/7",
                    "attributes": {
                      "_id": 7,
                      "vendor": "Vendor Ltd."
                    }
                  }
                ]
              }
            }
          }
        ]
      }
    }
  }
}

Используется формат JSON:API. Я пытался использовать группы, но это совсем не помогло, и я не могу ничего найти ни в одной документации.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 08 января 2019

https://api -platform.com / документы / ядро ​​/ сериализации / # встраивание-отношения

Итак, в вашем примере добавьте normalizationContext={"groups"={"claim"}} к Claim сущности, @Groups({"claim"}) к Claim свойствам, а затем @Groups("claim") к свойствам класса Activity, которые вы хотели бы встроить в ответ.

...