Доктрина, пространство имен и объекты автозагрузки

Я хочу использовать Doctrine 2 в моем проекте. У меня проблемы с этим. Я читал документы, но, вероятно, я делаю что-то неправильно.

Я хочу автозагружать классы объектов. И метод из документов не работает.

Мой bootstrap.php

<?php require_once "vendor/autoload.php"; use Doctrine\ORM\Tools\Setup; use Doctrine\ORM\EntityManager; use Doctrine\ORM\Mapping\Driver; $paths = array("../Entities"); $isDevMode = false; $classLoader = new \Doctrine\Common\ClassLoader('Entities','../Entities'); $classLoader->register(); // the connection configuration $dbParams = array( 'driver' => 'pdo_mysql', 'user' => 'xxx', 'password' => 'xxx', 'dbname' => 'xxx', ); $driver = new Doctrine\ORM\Mapping\Driver\AnnotationDriver(new Doctrine\Common\Annotations\AnnotationReader(),array('../Entities')); $config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode); $config->setMetadataDriverImpl($driver); $em = EntityManager::create($dbParams, $config); 

У меня есть классы моей модели в каталоге Entities. Я создал их с помощью клиента doctrine. Они выглядят хорошо. В начале есть идентификаторы, сеттеры, геттеры и пространство имен.

/Entities/ArticleCat.php

 <?php namespace Entities; use Doctrine\ORM\Mapping as ORM; /** * ArticleCat * * @ORM\Table(name="article_cat") * @ORM\Entity */ class ArticleCat { 

Мой сценарий, где я хочу использовать доктрину:

 <?php require_once 'bootstrap.php'; $article = $em->find('ArticleCat', 21); echo $article->getName(); 

Это не работает. Он работает только тогда, когда я использую его таким образом, и я удаляю пространство имен из модели Entity .

 <?php require_once 'bootstrap.php'; require_once 'Entities/ArticleCat.php'; //this line added (manual load) $article = $em->find('ArticleCat', 21); echo $article->getName(); 

Каков правильный способ использования доктрины и автозагрузочных объектов? Почему пространство имен является проблемой?

Мои ошибки:

 Fatal error: Uncaught exception 'Doctrine\Common\Persistence\Mapping\MappingException' with message 'Class 'ArticleCat' does not exist' in /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php:96 Stack trace: #0 /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php(40): Doctrine\Common\Persistence\Mapping\MappingException::nonExistingClass('ArticleCat') #1 /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping /AbstractClassMetadataFactory.php(267): Doctrine\Common\Persistence\Mapping \RuntimeReflectionService->getParentClasses('ArticleCat') #2 /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping /AbstractClassMetadataFactory.php(297): Doctrine\Common\Persistence\Mapping \AbstractClassMetadataFactory->getParentClasses('ArticleCat') #3 /myproject/vendor/doc in /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence /Mapping/MappingException.php on line 96 

Попробуйте использовать полное имя класса с пространством имен. Когда у вас возникла ошибка в прокси-классах CG, попробуйте сгенерировать свои прокси-классы, запустив

 vendor/bin/doctrine orm:generate-proxies 

удачи!

Если вы используете композитор, вы хотите быть уверены, что у вас есть следующая «автозагрузка» в вашем composer.json:

 { "require": { ... }, "autoload": { "psr-0": {"": "Entity/"} } } 

Это поставило проблему для меня. Однако я не использую пространство имен в классе сущности. Мой composer.json живет в моем каталоге inc и каталог Entity, на который ссылается здесь, находится в inc / Entity.

Хм, я всегда использовал ClassLoader когда дело ClassLoader до использования пространств имен. У меня было так много проблем с этим, что я использую класс конфигурации сортировки со всеми параметрами path/to/src , которые мне нужны.

Например, если ваш путь – path/to/src а ваше имя класса – Entities\ArticleCat тогда структура каталогов для расположения файла ArticleCat.php

 src \ Entities \ ArticleCat.php 

Теперь все, что вам нужно сделать, это создать ClassLoader для Entities

 $src = 'path/to/src' $cl = new ClassLoader('Entities', $src); $cl->register(); 

и класс ArticleCat теперь должен быть доступен с помощью EntityManager

 $articleCat = $em->getRepository('Entities\ArticleCat'); $article = $articleCat->find(21); echo $article->getName(); 

или

 $article = $em->find('Entities\ArticleCat', 21); echo $article->getName();