我在我的项目中使用了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());
}
答案 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>我认为这应该有用,但我没试过这个,所以如果这个错误,请纠正我。