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

mmm*_*mmm 5 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");
Run Code Online (Sandbox Code Playgroud)

len*_*ahy 9

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

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

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

....
Run Code Online (Sandbox Code Playgroud)


Yet*_*CGN 4

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

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

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

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