Использую 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;
// ....
}