Доктрина не работает, если я не вызываю явно AnnotationDriver :: getAllClassNames - PullRequest
6 голосов
/ 26 декабря 2010

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

Выполнение этих шагов напрямую приводит к следующей ошибке:

Предупреждение: class_parents () [function.class-parent]: Класс 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» с сообщением «Класс MyProject \ Model \ Пользователь не существует» в / 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 in / opt / local / lib / php / Doctrine / ORM / Mapping / ClassMetadata.php on line 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 ]

7 голосов
/ 27 декабря 2010

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

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

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

0 голосов
/ 07 апреля 2011

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

...