Правильный способ денормализации объекта (Doctrine Entity) с помощью отношений - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно денормализовать объект (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).

Какой из них является правильным? Или они оба не правы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...