Doctrine 2的不同实体/代理目录

时间:2011-03-15 14:23:34

标签: php doctrine-orm

我在我的项目中使用了doctrine 2,但是我将所有模块分成不同的文件夹,因此doctrine 2实体位于不同的目录中,具体取决于它们属于哪个模块。

我想知道在使用现有的数据库连接时是否可以更改Doctrine2实体和代理目录设置。我查看了EntityManager类,但看不到更新配置的函数。

如果没有内置解决方案,是否有人知道此函数是否可以在EntityManager类中运行:

public function updateConfiguration(Configuration $config)
{
    $this->config = $config;

    $metadataFactoryClassName = $config->getClassMetadataFactoryName();
    $this->metadataFactory = new $metadataFactoryClassName;
    $this->metadataFactory->setEntityManager($this);
    $this->metadataFactory->setCacheDriver($this->config->getMetadataCacheImpl());

    $this->proxyFactory = new ProxyFactory($this,
            $config->getProxyDir(),
            $config->getProxyNamespace(),
            $config->getAutoGenerateProxyClasses());
}

2 个答案:

答案 0 :(得分:1)

我不清楚你究竟是什么意思,但我会试一试。

数据库连接是EntityManager的一部分,但它们不相同。据我所知,如果连接已经建立,则无法对数据库连接进行更改。

在创建EntityManger实例之前,您必须确保已设置所有配置。您可以根据需要灵活地定义配置,但是一旦创建了entitymanager,您就无法更改它(如果我错了,请纠正我)。如果这样做,可能会导致已加载的其他实体出现问题,例如,您的刷新调用可能会失败。

如果要从不同位置加载实体,可以使用Doctrine类加载器。将模块的所有实体分配给命名空间,并从文件系统的任何位置加载该命名空间。

小代码示例

// Doctrine module
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', "/var/www/library/Doctrine/");
$classLoader->register();

// User modules
$classLoader = new \Doctrine\Common\ClassLoader('User', "/var/www/modules/models/User/");
$classLoader->register();

// Page module
$classLoader = new \Doctrine\Common\ClassLoader('Page', "/some/path/to/different/modules/models/Page/");
$classLoader->register();

我没有看到在请求期间更改EntityManager设置的用法。如果你必须这样做,那你就试图在错误的地方解决问题。我从来没有尝试过,也不想反正:)。

也许我不明白你的问题。如果是这样,请告诉我:)。

答案 1 :(得分:1)

可以从实体管理器中检索$ config,如下所示:

$config = $em->getConfiguration();

要动态更新实体路径,请尝试此操作(我自己没有尝试过):

$driverImpl = new Doctrine\ORM\Mapping\Driver\AnnotationDriver(array(
    APP_PATH . DIRECTORY_SEPARATOR .  'entities'
));
$config->setMetadataDriverImpl($driverImpl);

P.S>我认为这应该有用,但我没试过这个,所以如果这个错误,请纠正我。