在Zend Framework 2项目中,Doctrine 2无法找到我的实体,我不知道为什么。对我来说,一切看起来都正确,但php ./vendor/bin/doctrine-module orm:schema-tool:create
命令基于实体创建数据库导致No Metadata Classes to process.
。
当然我首先确定所有模块都已加载,所以它并不那么容易;-)我也已经对这个问题做了一些研究,似乎大多数时候,它的名称空间相关,但是我再也看不到了那里有什么问题。我还生成了自动加载文件。
您是否能够发现这些文件中的任何错误,为什么Doctrine无法找到实体?它可能与我的文件中的错误有关吗?
在module.config.php
中,Doctrine配置如下:
'doctrine' => [
'driver' => [
'Catalog_entities' => [
'class' =>'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => [__DIR__ . '/../src/Catalog/Entity']
],
],
'orm_default' => [
'drivers' => [
'Catalog\Entity' => 'Catalog_entities'
],
],
],
module.config.php
没有namespace
声明,因为它被包含在Module.php
中,顶部有namespace Catalog;
。
module/Catalog/src/Catalog/Entity/WorkEntity.php
的实体看起来像这样:
namespace Catalog\Entity;
use Doctrine\ORM\Mapping as ORM;
/** @ORM\Entity */
class Work {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
protected $id;
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
}
}
首先修复@Crisp他的评论。文件名和类名应始终对应。
如果这不能解决它,你可以检查你的Module.php
中是否正确加载了module.config.php:
/**
* @return array
*/
public function getConfig()
{
return __DIR__ . '/../../config/module.config.php';
}
我还建议使用命名空间常量,这样您就可以简单地将配置复制到不同的模块而不会改变任何事情,并最大限度地降低在忘记更改内容时覆盖其他配置的风险。像这样:
'driver' => [
__NAMESPACE__ . '_driver' => [
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => [__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity']
],
'orm_default' => [
'drivers' => [
__NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
]
]
],