Я использую Doctrine для проекта typo3 / cms для расширения возможностей рабочих процессов бэкэнда.
Так что мне пришлось загружать учение самостоятельно. Большая часть этого была довольно легкой, и у меня нет проблем вообще. Но когда дело дошло до сохранения существующей сущности, я боролся. Каждый раз, когда я сохранял существующую сущность, она создавалась как новая.
После некоторых копаний я пришел к выводу, что это не часть «UnitOfWork» (-> содержит (entity) == false). Если я зарегистрировал его вручную в этом устройстве, все снова заработало.
$this->entityManager->getUnitOfWork()->registerManaged($page, array('uid' => $page->getUid()), array('title' => $page->getTitle()));
Но это не может быть концом истории … поэтому я все еще пытаюсь выяснить, что не так с моей доктриной: D
Почему мои извлеченные объекты не управляются?
Это мой DoctrineLoader:
private function createEntityManager()
{
global $GLOBALS;
$paths = array(
MyT3Extension::rootDir() . '/Configuration/ORM'
);
$isDevMode = true;
$typoDbConfig = $GLOBALS['TYPO3_CONF_VARS']['DB'];
// the connection configuration
$dbParams = array(
'driver' => 'pdo_mysql',
'user' => $typoDbConfig['username'],
'password' => $typoDbConfig['password'],
'dbname' => $typoDbConfig['database'],
'charset' => 'utf8'
);
$config = Setup::createYAMLMetadataConfiguration($paths, $isDevMode, MyT3Extension::rootDir() . '/Cache');
$entityManager = EntityManager::create($dbParams, $config);
return $entityManager;
}
Определение Yml для модели orm:
Vendor\TypoBundle\Entity\Page:
type: entity
table: pages
id: { uid: { type: integer, generator: { strategy: AUTO } } }
fields:
pid: { type: integer }
title: { type: string }
navTitle: { type: string, column: nav_title }
doctype: { type: integer, column: doktype }
isSiteroot: { type: boolean, column: is_siteroot }
layout: { type: integer }
Пример кода для использования:
$page = $this->entityManager->getRepository('Vendor\TypoBundle\Entity\Page')->findOneBy(array());
$page->setTitle('Test');
$this->entityManager->persist($page);
$this->entityManager->flush(); // will create a new record (new uid)
Что работает как:
$page = $this->entityManager->getRepository('Vendor\TypoBundle\Entity\Page')->findOneBy(array());
$this->entityManager->getUnitOfWork()->registerManaged(
$page,
array(
'uid' => $page->getUid()
), array(
'title' => $page->getTitle()
)
);
$page->setTitle('Test');
$this->entityManager->persist($page);
$this->entityManager->flush();
Итак .. я надеюсь, что кто-нибудь может мне помочь: D (я буду искать в доктрине Symfony расслоение для решения ..)
Хорошо … я нашел решение … я использовал специальную «технику» внедрения зависимостей в typo3 extbase.
Если вы укажете свои зависимости в качестве аргументов __concstruct (), он внедрит сервис без дальнейшей настройки. Поэтому я просто предположил, что он использует внутреннюю «служебную шину» для обслуживания всех зависимостей с одинаковыми экземплярами объекта, но вместо этого он создал одну для каждого запроса зависимости.
Таким образом, у меня есть три разных менеджера сущностей .. и, очевидно, как-то неуправляемые сущности .. извините, что беспокою вас, ребята
Других решений пока нет …