Доктрина — Управляемый объект — Полученные объекты по умолчанию не управляются

Я использую 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 расслоение для решения ..)

4

Решение

Хорошо … я нашел решение … я использовал специальную «технику» внедрения зависимостей в typo3 extbase.
Если вы укажете свои зависимости в качестве аргументов __concstruct (), он внедрит сервис без дальнейшей настройки. Поэтому я просто предположил, что он использует внутреннюю «служебную шину» для обслуживания всех зависимостей с одинаковыми экземплярами объекта, но вместо этого он создал одну для каждого запроса зависимости.

Таким образом, у меня есть три разных менеджера сущностей .. и, очевидно, как-то неуправляемые сущности .. извините, что беспокою вас, ребята

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]