Doctrine 2:从数据库生成的实体没有命名空间

5

我正在使用 \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory() 类从数据库中创建实体。这个过程非常完美,除了命名空间的生成。没有生成命名空间。 我将实体存储在 App/Model/Entities 中。

有人知道如何让生成器为实体添加命名空间吗?

以下是我用于生成实体的代码:

<?php
$em->getConfiguration()->setMetadataDriverImpl(
    new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
        $em->getConnection()->getSchemaManager()
    )
);

$cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
$cmf->setEntityManager($em);
$metadata = $cmf->getAllMetadata();

// GENERATE PHP ENTITIES!
$entityGenerator = new \Doctrine\ORM\Tools\EntityGenerator(); 
$entityGenerator->setGenerateAnnotations(true); 
$entityGenerator->setGenerateStubMethods(true); 
$entityGenerator->setRegenerateEntityIfExists(false); 
$entityGenerator->setUpdateEntityIfExists(true); 
$entityGenerator->generate($metadata, __dir__. '/Model/Entities");
3个回答

9

我认为更好的方法是直接将命名空间设置到驱动程序中。

<?php
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver($em->getConnection()->getSchemaManager());
$driver->setNamespace('App\\Model\\Entities\\');

$em->getConfiguration()->setMetadataDriverImpl($driver);

....

这对我有用,并生成了具有正确命名空间声明的实体。 - Ian

4

我认为在从数据库导入时无法设置命名空间,因为EntityGenerator会从元数据中获取命名空间信息。数据库没有或不需要命名空间,因此该信息不会自动来自数据库。

你可以尝试循环遍历$metadata对象并将命名空间添加到类名称中。EntityGenerator中检索命名空间的代码非常简单:

private function _getNamespace(ClassMetadataInfo $metadata)
{
    return substr($metadata->name, 0, strrpos($metadata->name, '\\'));
}

如果一切都失败了,您始终可以实现自己的EntityGenerator并将命名空间提供给它使用。在我们的大型项目中,我们就是这样做的,因为在生成过程中还有其他自定义任务需要完成。但是,EntityGenerator不容易被覆盖,有很多私有方法和属性,所以您可能需要复制&paste整个内容。


谢谢!你的解决方案实现了我的实体生成器,太棒了!我会采用这个方案。比我从数据库制作XML映射文件的临时解决方案要好。替换所有的XML文件字符串。然后从中生成实体 :P 再次感谢! - mmmmm

-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接