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");
4

3 回答 3

9

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

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

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

....
于 2012-11-16T13:22:25.987 回答
4

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

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

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

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

于 2012-09-28T13:36:29.703 回答
-3

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

于 2015-04-08T11:49:27.587 回答