Лучшая практика для возврата пользовательских 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-платформы.
Я лично использую этот метод для согласования внешних связей (не сохраняемых доктриной) с (сохраняющимися) сущностями.