Мне нужно денормализовать объект (Doctrine Entity)
из array
(он получен из POST JSON
и декодирован в связанный PHP array
). Основная цель - сохранить объект и все его отношения (которые тоже имеют некоторые отношения).
Базовый объект
class Product
{
private $id;
/**
* @ORM\OneToMany(targetEntity="App\Entity\ProductAttribute", mappedBy="product", cascade={"persist"})
*/
private $attributes;
}
Объект отношений
class ProductAttribute
{
private $id;
private $name;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Product", inversedBy="attributes")
* @ORM\JoinColumn(nullable=false)
*/
private $product;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ProductAttributeType", inversedBy="productAttributes")
* @ORM\JoinColumn(nullable=false)
*/
private $type;
}
Еще одинобъект отношения
class ProductAttributeType
{
private $id;
private $name;
/**
* @ORM\OneToMany(targetEntity="App\Entity\ProductAttribute", mappedBy="type")
*/
private $productAttributes;
}
Массивы выглядят следующим образом
[
'id' => 1,
'attributes' => [
[
'id' => 2,
'name' => 'Name of attribute with ID 2',
'type' => 2,
],
[
'id' => 3,
'name' => 'Changed name of attribute with ID 3',
'type' => 3
]
],
]
Основная цель состоит в денормализации массива (в любое время имя ProductAttribute может быть изменено и должно быть сохранено, поэтому нам нужноприсылайте имя каждый раз). Я попробовал два подхода с созданным пользовательским денормализатором (расширяет стандартную версию Symfony Serializer):
использовал всю работу по заполнению сущностей Doctrine для денормализации (), вводя EntityManager непосредственно в denormalizer и используячтобы найти сущности
, которые не внедрили EntityManager и не подготовили все модели в контроллере, перед тем как вызвать денормализацию и отправить их через $ context
В любомтаким образом это заканчивается вызовом в денормализаторе
$product->setAttributes($attributes)
, где $ attribute - это массив объектов ProductAttribute (как Doctrine Entities).
Какой из них является правильным? Или они оба не правы?