我第一次尝试使用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);
答案 0 :(得分:7)
听起来你没有为你的项目正确设置类加载器:
$classloader = new \Doctrine\Common\ClassLoader('MyProject', '/path/to/lib/');
$classloader->register();
调用getAllClassNames()解决问题的原因是因为它遍历/ path / to / lib / MyProject / Entities中的所有目录和文件并包含它们。显然这很慢,不推荐。
答案 1 :(得分:0)
此外,您无法加载没有命名空间的实体。这些类不是自动加载的。