原则2:数据库中生成的实体没有名称空间

时间:2012-09-26 11:12:17

标签: php doctrine doctrine-orm

我正在通过\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 个答案:

答案 0 :(得分:9)

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

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

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

....

答案 1 :(得分:4)

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

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

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

如果所有其他方法都失败了,您始终可以实现自己的EntityGenerator,您可以提供要使用的命名空间。我们在我们的大型项目中做到了这一点,在这个项目中,在生成过程中还有其他一些自定义任但是,EntityGenerator不容易被覆盖,有很多私有方法和属性,所以你可能需要复制和粘贴整个东西。

答案 2 :(得分:-3)

您可以使用此PHP脚本从数据库表生成实体。 此脚本将一个示例命名空间添加到生成的文件中,因此您可以设置命名空间。 https://gist.github.com/SamvelG/3b39622844f23cac7e76#file-doctrine-entity-generator-php