Коллекция форм Symfony2 не проверяет наличие идентификатора

#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:

Я решаю свою проблему с помощью прослушивателя событий, который изменяет порядок дочерних форм, чтобы они соответствовали идентификаторам повторного запроса.