Доктрина не обновляет свойства объекта cmf SeoBundle после установки - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Symfony cmf seoBundle. Мой класс сущностей использует SeoAwareTrait. Когда я пытаюсь обновить свои свойства SEO (я использую код ниже), я получаю результат со старыми значениями свойств.

    $entity = $this->galleryManager->findByLink($link);


                $entity->getSeoMetadata()->setTitle($metaTitle);
                $entity->getSeoMetadata()->setMetaDescription($metaDescription);
                $entity->getSeoMetadata()->setMetaKeywords($metaKeywords);

                $em->persist($entity);
                $em->flush();

Когда я пытаюсь клонировать мои seo-свойства, Doctrine успешно сохраняет мои новые значения:

   $entity = $this->galleryManager->findByLink($link);


                $entity->getSeoMetadata()->setTitle($metaTitle);
                $entity->getSeoMetadata()->setMetaDescription($metaDescription);
                $entity->getSeoMetadata()->setMetaKeywords($metaKeywords);

                $entity->setSeoMetadata(clone $entity->getSeoMetadata());

                $em->persist($entity);
                $em->flush();

Почему во втором случае доктрина обновляет результат, а не в первом? Правильно ли я понимаю, что доктрина не воспринимает изменения свойств, относящихся к другим объектам?

1 Ответ

0 голосов
/ 26 апреля 2019

В первом примере вы вызываете методы "setTitle", "setMetaDescription", "setMetaKeywords" в результате получения "getSeoMetadata".Этот результат не является $ entity, но вы исключаете чистоту только $ entity.

См .:

$entity->getSeoMetadata()

Возвращает что-то (я угадываю объект), и вы устанавливаете данные для объекта, а не для$ entity:

$entity->getSeoMetadata()->setMetaKeywords($metaKeywords);

В приведенном выше примере "setMetaKeywords ()" вызывается по РЕЗУЛЬТАТУ "getSeoMetadata ()".Что вы получаете от этого метода?

Я бы сделал это так:

$entity = $this->galleryManager->findByLink($link);
$entitySeoMetadata = $entity->getSeoMetadata();

$entitySeoMetadata->setTitle($metaTitle);
$entitySeoMetadata->setMetaDescription($metaDescription);
$entitySeoMetadata->setMetaKeywords($metaKeywords);

/*
* persist only if the item is new. If you have fetched this from doctrine, 
* do not persist it - just flush without persist.
*
* $em->persist($entity); 
*/

$em->flush();
...