除非我明确调用AnnotationDriver :: getAllClassNames,否则Doctrine不起作用

时间:2010-12-26 00:55:17

标签: php orm annotations doctrine-orm

我第一次尝试使用Doctrine ORM,我正在关注configuration found here

按照这些步骤直接导致以下错误:

  

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

     

警告: array_reverse()期望参数1为数组,给定布尔值   在   的 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php   在线 222

     

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

     

致命错误:带消息的未捕获异常'ReflectionException'   'Class MyProject \ Model \ User没有   存在于   /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadata.php:67

     

堆栈追踪:

     

#0 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadata.php(67):   ReflectionClass-> __构建体( 'MyProject的\模型...')

     

#1 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php(350):   教义\ ORM \映射\ ClassMetadata-> __构建体( 'MyProject的\模型...')

     

#2 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php(260):   教义\ ORM \映射\ ClassMetadataFactory-> newClassMetadataInstance( 'MyProject的\模型...')

     

#3 /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php(169):   教义\ ORM \映射\ ClassMetadataFactory-> loadMetadata( 'MyProject的\模型...')

     

#4 /opt/local/lib/php/Doctrine/ORM/EntityManager.php(247):   教义\ ORM \映射\ ClassMetadataFactory-> getMetadataFor( 'MyProject的\模型...')

     

#5 /opt/local/lib/php/Doctrine/ORM/EntityManager.php(563):   教义\ ORM \ EntityManager-> getClassMetadata( 'MyProject的\模型...')

     

#6 / opt in /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadata.php   在线 67

此错误消失了,如果在示例代码中,我添加了以下行(用下面的注释表示),代码完美无缺:

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

没有任何内容提到要使示例代码工作所需的此调用;这只是我碰巧偶然发现的东西,同时在试图查看错误发生的位置时向屏幕回显一些信息。

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

(我可以根据需要发布更多代码,我只是不肯定,因为这是我第一次使用Doctrine时最有帮助的事情。)

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:0)

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