Возвращает только определенные поля для определенных групп при сериализации с помощью Symfony 4

#php #symfony #serialization

#php #symfony #сериализация

Вопрос:

Symfony 4. У меня есть две сущности, Cat и Owner .

 class Cat
{
    /**
     * @ORMId()
     * @ORMGeneratedValue()
     * @ORMColumn(type="integer")
     * @Groups("cats")
     */
    private $id;

    /**
     * @ORMColumn(type="string", length=255)
     * @Groups("cats")
     */
    private $name;

    /**
     * @ORMManyToMany(targetEntity="AppEntityOwner", mappedBy="cat")
     * @Groups("cats")
     */
    private $owners;
}

class Owner
{
    /**
     * @ORMId()
     * @ORMGeneratedValue()
     * @ORMColumn(type="integer")
     * @Groups("cats")
     */
    private $id;

    /**
     * @ORMColumn(type="string", length=255)
     * @Groups("owners")
     */
    private $name;
}
  

Моя конечная точка API должна возвращать 2 ключа owners (список всех владельцев) и cats (список всех кошек с их владельцами).

 public function index()
{
    $repository = $this->getDoctrine()->getRepository(Owner::class);
    $owners = $repository->findAll();
    $repository = $this->getDoctrine()->getRepository(Cat::class);
    $cats = $repository->findAll();
    return $this->json([
        'owners' => $owners,
        'cats' => $cats,
    ], 200, [], ['groups' => ['owners', 'cats']]);
}
  

Это работает, но с 1 проблемой: cats список содержит полную информацию о владельце для каждого владельца, т. Е.:

 {
  "owners": [
    {
      "id": 1,
      "name": "John Smith"
    }
  ],
  "cats": [
    {
      "id": 1,
      "name": "Miaow",
      "owners": [ 
        {
          "id": 1,
          "name": "John Smith"
        }
      ]
    }
  ]
}
  

Я хочу, чтобы owners ключ в cat объекте возвращал только владельца id , например:

 {
  "owners": [
    {
      "id": 1,
      "name": "John Smith"
    }
  ],
  "cats": [
    {
      "id": 1,
      "name": "Miaow",
      "owners": [ 
        1
      ]
    }
  ]
}
  

Ответ №1:

Вы можете использовать геттер для определенной группы и с определенным сериализованным именем.

В Cat :

 /**
 * @Groups("cats")
 * @SerializedName("owners")
*/
public function getOwnersIds(): iterable
{
    return $this->getOwners()->map(function ($owner) {
        return $owner->getId();
    })->getValues();
}
  

Комментарии:

1. Спасибо. Поскольку $this->getOwners() возвращает коллекцию, а не массив, это не совсем работает. Но вы указали мне правильное направление. Это работает : return $this->getOwners()->map(function ($owner) { return $owner->getId(); })->getValues(); . Если вы обновите свой ответ, я отмечу его правильно.

Ответ №2:

Переопределите отображение поля.

Смотрите Документацию doctrine: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html