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)
我认为,更好的方法是将命名空间直接设置为驱动程序
<?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)
我认为从数据库导入时不能设置命名空间,因为 EntityGenerator 从元数据中获取命名空间信息。数据库没有或不需要命名空间,因此信息不会自动来自那里。
您可以尝试循环 $metadata 对象并将命名空间自己添加到类名中。EntityGenerator 中检索命名空间的代码非常简单:
private function _getNamespace(ClassMetadataInfo $metadata)
{
return substr($metadata->name, 0, strrpos($metadata->name, '\\'));
}
Run Code Online (Sandbox Code Playgroud)
如果一切都失败了,您始终可以实现自己的 EntityGenerator,您可以提供一个命名空间来使用。我们在大型项目中做到了这一点,在生成过程中还有一些其他自定义任务需要完成。但是,EntityGenerator 不容易被覆盖,有很多私有方法和属性,因此您可能必须复制并粘贴整个内容。
| 归档时间: |
|
| 查看次数: |
3236 次 |
| 最近记录: |