#forms #rest #symfony #collections
#формы #rest #symfony #Коллекции
Вопрос:
Я не знаю, является ли это проблемой конфигурации или работает по назначению, если я не использую его должным образом. Но когда я отправляю запрос PUT с объектом A, который содержит коллекцию объектов B, метод bind пытается перезаписать свойства объектов B.
Пример :
ПОЛУЧИТЬ объект A :
{
id : 1,
name : "test",
collection : [
0 : { id : 2, name : "Entity B - 2", line : 0, property : "stuff" },
1 : { id : 3, name : "Entity B - 3", line : 1 }
]
}
ПОМЕСТИЛ объект A : (удалил идентификатор объекта B 2 из коллекции)
{
id : 1,
name : "test",
collection : [
0 : { id : 3, name : "Entity B - 3", line : 0 }
]
}
Результат :
{
id : 1,
name : "test",
collection : [
0 : { id : 2, name : "Entity B - 3", line : 0, property : "stuff" }
]
}
Конфигурация :
EntityA
/**
* @ORMOrderBy({"line" = "ASC"})
* @ORMOneToMany(targetEntity="entityB", mappedBy="entityA", cascade= { "persist", "remove"})
*/
private $collection;
public function addCollection($entityB)
{
$this->collection[] = $entityB;
$lines->setEntityA($this);
return $this;
}
public function removeCollection($entityB)
{
$this->collection->removeElement($entityB);
$lines->setEntityA(null);
}
EntityB
/**
*
* @ORMManyToOne(targetEntity="entityA", inversedBy="collection")
*/
private $entityA;
Контроллер
$form = $this->createForm(new $entityAType(), $entity);
$form->bind($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
}
Форма
->add('collection', 'collection', array(
"type" => new entityBType,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'cascade_validation' => true,
))
Ответ №1:
Я решаю свою проблему с помощью прослушивателя событий, который изменяет порядок дочерних форм, чтобы они соответствовали идентификаторам повторного запроса.