6

我第一次尝试使用 Doctrine ORM,我正在按照此处找到的配置

执行这些步骤会直接导致以下错误:

警告: class_parents() [function.class-parents]: Class MyProject\Model\User 不存在,无法 在第222 行的/opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php中加载

警告: array_reverse() 期望参数 1 是数组,布尔值在 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php222行

警告:在第222 行的/opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php中 为 foreach() 提供的参数无效

致命错误: /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadata.php:67 中的消息“Class MyProject\Model\User 不存在”未捕获的异常“ReflectionException”

堆栈跟踪:

#0 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadata.php(67): ReflectionClass->__construct('MyProject\Model...')

#1 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php(350): Doctrine\ORM\Mapping\ClassMetadata->__construct('MyProject\Model...')

#2 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php(260): Doctrine\ORM\Mapping\ClassMetadataFactory->newClassMetadataInstance('MyProject\Model...')

#3 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php(169): Doctrine\ORM\Mapping\ClassMetadataFactory->loadMetadata('MyProject\Model...')

#4 /opt/local/lib/php/Doctrine/ORM/EntityManager.php(247): Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor('MyProject\Model...')

#5 /opt/local/lib/php/Doctrine/ORM/EntityManager.php(563): Doctrine\ORM\EntityManager->getClassMetadata('MyProject\Model...')

#6 /opt in /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadata.php67行

如果在示例代码中添加以下行(用下面的注释表示),此错误就会消失,并且代码可以完美运行:

$driverImpl = $config->newDefaultAnnotationDriver('/path/to/lib/MyProject/Entities');
$driverImpl->getAllClassNames();  // **MY ADDED LINE**
$config->setMetadataDriverImpl($driverImpl);

没有任何内容提到需要此调用才能使示例代码正常工作;这只是我在尝试查看错误发生的位置时将一些信息回显到屏幕时偶然发现的事情。

是否有需要此调用的原因(以及示例代码中未提及的原因)?是否应该调用其他东西,这是我原来错误的根本原因?

(我可以根据需要发布更多代码,我只是不确定什么对解决这个问题最有帮助,因为这是我第一次使用 Doctrine。)

编辑:我忽略了实际发生错误的行:

$user = $em->find('MyProject\Model\User', 1);
4

2 回答 2

7

听起来您没有为您的项目正确设置类加载器:

$classloader = new \Doctrine\Common\ClassLoader('MyProject', '/path/to/lib/');
$classloader->register();

调用 getAllClassNames() 解决您的问题的原因是因为它遍历 /path/to/lib/MyProject/Entities 内的所有目录和文件并包含它们。显然这很慢,不推荐。

于 2010-12-27T16:24:27.433 回答
0

此外,您无法加载没有命名空间的实体。这些类不会自动加载。

于 2011-04-07T10:20:00.480 回答