Лучшая практика для возврата пользовательских JSON на API-платформу

Привет,

Я полностью новичок в Symfony 4 & API Platform и хочу обновить свой существующий API (созданный с помощью FOSRest).

У меня есть много маршрутов, которые возвращают пользовательские объекты JSON, отличные от моих сущностей.

Например, у меня есть Offer юридическое лицо

<?php
// api/src/Entity/Offer.php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * An offer from my shop - this description will be automatically extracted form the PHPDoc to document the API.
 *
 * @ApiResource(iri="http://schema.org/Offer")
 * @ORM\Entity
 */
class Offer
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @ORM\Column(type="text")
     */
    public $description;

    /**
     * @ORM\Column(type="float")
     * @Assert\NotBlank
     * @Assert\Range(min=0, minMessage="The price must be superior to 0.")
     * @Assert\Type(type="float")
     */
    public $price;

    /**
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="offers")
     */
    public $product;
}

И я хочу вернуть объект JSON на основе этого объекта продукта, но с настраиваемыми полями.

Действительно ли обязательно создавать новый ресурс только для этого одного метода GET или есть лучший способ сделать это?

Спасибо.

1 ответ

Существует несколько способов добавления пользовательских данных:

(самый простой) Добавить пользовательский метод объекта

class Offer
{
    public function getSomethingCustomized() 
    {
        return 'something_customized';
    }
}

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

Укрась сериализатор

Если ваши пользовательские данные должны быть извлечены извне: Вот документация

Переопределяет значение по умолчанию Serializer сервис (вызывается перед отправкой ответа) и позволяет добавлять дополнительные данные (откуда угодно) к каждому запросу.

Используйте события

Если вам нужно более детальное управление, вы также можете подключить одно (или более) событие API-платформы.

Я лично использую этот метод для согласования внешних связей (не сохраняемых доктриной) с (сохраняющимися) сущностями.

Другие вопросы по тегам