Doctrine не работает, если я явно не вызываю AnnotationDriver :: getAllClassNames

Я пытаюсь использовать Doctrine ORM в первый раз, и я следую за конфигурацией, найденной здесь .

После этих шагов непосредственно возникает следующая ошибка:

Предупреждение: class_parents () [function.class-parents]: класс MyProject \ Model \ User не существует и не может быть загружен в /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php в строке 222

Предупреждение: array_reverse () ожидает, что параметр 1 будет массивом, boolean задан в /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php в строке 222

Предупреждение: неверный аргумент, предоставленный foreach () в /opt/local/lib/php/Doctrine/ORM/Mapping/ClassMetadataFactory.php в строке 222

Неустранимая ошибка: исключение исключения «ReflectionException» с сообщением «Класс 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 -> __ 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/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.)

EDIT: Я забыл упомянуть о линии, на которой происходит ошибка:

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

Related of "Doctrine не работает, если я явно не вызываю AnnotationDriver :: getAllClassNames"

Похоже, что у вас нет правильного загрузчика классов для вашего проекта:

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

Причина, вызывающая getAllClassNames (), – это исправление вашей проблемы, потому что она проходит все каталоги и файлы внутри / path / to / lib / MyProject / Entities и включает их. Очевидно, что это медленно и не рекомендуется.

Кроме того, вы не можете загружать объекты без пространства имен. Эти классы не загружаются автоматически.