Как автоматически загружать вложенные сущности (ParamConverter)?

Использую FOSRestBundle, JMSSerializerBundle. Для get-запроса нужная сущность автоматически подгружается из БД:
/**
     * @param ProductCategory $slug
     * @return ProductCategory
     *
     * @Rest\Route(requirements={"slug" = "\d+"})
     * @Rest\View()
     */
    public function getAction(ProductCategory $slug)
    {
        return $slug;
    }


А для post-запроса на добавление у нас в теле запроса id всегда отсутствует, но есть id вложенных сущностей (Image, например).
Как бы сделать так, чтобы вложенные сущности у которых id задан загружались автоматически из БД?

/**
     * @param ProductCategory $category
     * @return ProductCategory
     *
     * @Rest\Route(path="")
     * @ParamConverter(
     *      name="category",
     *      converter="fos_rest.request_body",
     *      class="FiveToFive\ergil\DomainBundle\Entity\ProductCategory"
     * )
     * @Rest\View()
     */
    public function postAction(ProductCategory $category)
    {
        $categoryService = $this->get("product.category.service");
        return $categoryService->createNew($category);
    }


Пример тела запроса:
{
    "title": "My second post",
    "image": {
        "id": 20
    }
}


Пример сущности:
ProductCategory

/**
 * @ORM\Entity
 * @Serializer\ExclusionPolicy("ALL")
 */
class ProductCategory
{
    /**
     * @var integer
     *
     * @Assert\Blank(groups={"import"})
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @Serializer\Expose()
     */
    private $id;

    /**
     * @var string
     *
     * @Assert\NotBlank(groups={"import"})
     * @Assert\Length(max="250", groups={"import"})
     * @ORM\Column(type="string", unique=true, length=255, nullable=false)
     * @Serializer\Expose()
     */
    private $title;

    /**
     * @var Image
     *
     * @Assert\NotBlank(groups={"import"})
     * @Assert\Valid()
     * @ORM\OneToOne(targetEntity="FiveToFive\ergil\DomainBundle\Entity\Image", cascade={ "remove" })
     * @ORM\JoinColumn(name="image_id", referencedColumnName="id", unique=true)
     * @Serializer\Expose()
     */
    private $image;

    /**
     * @var ArrayCollection|Product
     *
     * @Assert\Valid()
     * @Assert\Collection\Optional()
     * @ORM\OneToMany(targetEntity="FiveToFive\ergil\DomainBundle\Entity\Product", mappedBy="category")
     */
    private $products;

    // ....
}

  • Вопрос задан
  • 482 просмотра
Решения вопроса 1
iNikNik
@iNikNik Автор вопроса
Время шло и я внезапно понял, что в добавок ко всему, param converter ВООБЩЕ не вызывает конструкторы сущностей. Немного погуглив нашел это (git issue) и это (stackoverflow): если добавить в конфиг сервисов:
services:
    # ...
    jms_serializer.object_constructor:
        alias: jms_serializer.doctrine_object_constructor
        public: false

То сущности будут инициализироваться как надо и в качестве бонуса param converter таки начнет загружать вложенные сущности. В документации я это конечно нашел, но только сейчас.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
JmsSerializer может это все десериализовать, а в fos rest есть нужный вам param converter.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы