Представьте, у меня есть коллекция массивов $items
, и я реализовал метод removeItem
в своем классе сущностей SomeEntity
,
public function removeItem(Item $item)
{
$this->items->removeElement($item);
return $this;
}
и действие контроллера, которое получает запрос PATCH:
public function patchAction(Request $request, SomeEntity $entity) {
$form = ...;
$form->handleRequest($request);
if ($form->isValid()) {
...
$this->get('doctrine.orm.entity_manager')->flush();
return $entity;
}
return $form;
}
Представьте, что экземпляр класса SomeEntity
содержит элементы как [0 => {ITEM}, 1 => {ITEM}, 2 => {ITEM}, 3 => {ITEM}]
(индексированный массив объектов). Если вы отправите запрос на getAction
и получите объект SomeEntity
в своем фронт-проекте в формате JSON, тип этих элементов в объекте будет индексированным массивом объектов (вы можете перебирать их с помощью методов массива), но если вы удалите одного или нескольких из объекта с методом PATCH и получить ответ JSON, вы получите тип Object с объектами в нем, потому что некоторые ключи были удалены после запроса PATCH, а объект класса SomeEntity в ответе больше не содержит индексированный массив, вместо него будет объект объектов. Это связано с тем, что при преобразовании массива в объект json вы можете получить два разных результата.
- массив объектов (массивов), если ключи проиндексированы (например: 0,1,2,3,...)
- объект объектов (массивов), если ключи не проиндексированы (например: 0,2,3,6,...)
В данный момент я решаю эту проблему, изменяя (вручную воссоздавая элементы) существующий метод removeItem
в классе сущностей, например:
public function removeItem(Item $item)
{
$this->items->removeElement($item);
if (!$this->items->isEmpty()) {
$items = new ArrayCollection();
foreach ($this->items as $item) {
$items->add($item);
}
$this->items = $items;
}
return $this;
}
Может быть, есть лучший способ решить эту проблему? Как решить эту проблему?
Я использую FOSRestBundle и JmsSerializerBundle.