Symfony2 FOSRestBundle возвращает поля сущности, содержащиеся в форме

Я использую FOSRestBundle в Symfony2 для предоставления REST-сервиса.

В настоящее время мой контроллер возвращает объект при запросе ресурса (например, /users/40). Интерфейс содержит форму, которая позволяет манипулировать этим ресурсом и отправляет его обратно с помощью PUT. Контроллер использует форму для обработки данных.

Моя проблема в том, что в форме меньше полей, чем во всей сущности (хорошими примерами являются id и password_hash). Я пришел к выводу, что отправлять клиенту всю сущность — плохая идея. Вместо этого я хочу, чтобы FOSRestBundle отправлял только те поля сущности, которые доступны в форме.

Итак, я только что попробовал:

return $this->createForm(UserType::class, $entity);

Структура JSON, возвращаемая FOSRestBundle с сервера, выглядит очень хорошо. Но, к сожалению, он не содержит значений.

Конечно, нет - форма не привязана. И на данный момент нет смысла привязывать данные. Следовательно, мне нужно найти другое решение.

Этот вариант использования будет очень распространенным в моих приложениях. Поэтому мне интересно, не было ли простого/стандартного способа добиться этого.

(P.S. Я использую Angular JS во внешнем интерфейсе. Я просто присоединяю объектный ресурс JSON к области и использую шаблоны форм symfony для создания полей формы, которые автоматически привязываются к правильному объекту области)


person fishbone    schedule 16.06.2016    source источник


Ответы (1)


Стандартный способ определить, что должно быть возвращено из FOS, — это использовать группы сериализаторов и либо компонент сериализатора Symfony, либо сериализатор JMS.

В обоих случаях вы определяете группы в свойствах вашего объекта:

// in the entity
use Symfony\Component\Serializer\Annotation\Groups;

class Story
{
    /**
     * @Groups({"story"})
     *
     * @var int
     */
    private $id;

А потом:

 // in the controller
 * @Rest\View(serializerGroups={"story"})
 * @Rest\Route("stories")
 *
 * @return Story[]
 */
public function getStoriesAction()

Который вернет вам объект или объекты со свойствами, соответствующими открытым группам сериализатора контроллера.

person mickadoo    schedule 16.06.2016