【问题标题】:Doctrine - Managed Entity - Fetched Entites are not managed by defaultDoctrine - 托管实体 - 默认情况下不管理获取的实体
【发布时间】:2015-07-30 11:47:17
【问题描述】:

我正在将 Doctrine 用于一个typo3/cms 项目,以增强后端工作流程的能力。

所以我不得不自己引导学说。大部分都很容易,我完全没有问题。但是当谈到坚持一个现有的实体时,我很挣扎。每次我持久化一个现有实体时,它都会被创建为一个新实体。

经过一番挖掘,我得出结论,这不是“UnitOfWork”的一部分(->contains(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;
}

orm模型的Yml定义:

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 包中寻找解决方案..)

【问题讨论】:

  • 嗨 Dragnic,你描述的行为很奇怪。你能概述一个你坚持这些实体的例子吗?
  • 我更新了描述
  • 通常 registerManaged 函数在水合期间执行.. 但我不明白为什么它被跳过
  • 我明白了,我可以告诉你做的是正确的事情,此时问题应该是工作的统一性,甚至是实体管理器的构建;我会尝试输出 UnitOfWork 的内部状态,并可能在您从数据库中检索实体 id 后检查它。
  • gnarf.. 我找到了解决方案.. 是一个打字错误/extbase 问题,而不是一个教义问题.. 抱歉.. 我在下面发布答案。感谢您的时间:D

标签: php symfony doctrine-orm typo3 unit-of-work


【解决方案1】:

好的。我找到了解决方案。我在typo3 extbase 中使用了一种特殊的依赖注入“技术”。 如果您将依赖项指定为 __construct() 的参数,它将在没有任何进一步配置的情况下注入服务。所以我只是假设,它使用内部“服务总线”来为所有具有相同对象实例的依赖项提供服务,但它为每个依赖项请求创建了一个。

所以我有三个不同的实体管理器,显然不知何故没有管理实体.. 很抱歉打扰你们。

【讨论】:

  • 我在 __construct() 方法中遇到了与自动装配/绑定完全相同的问题。我真的不是同一个实体经理,我的实体根本没有得到管理!
猜你喜欢
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
相关资源
最近更新 更多