Zend Framework и Doctrine 2 — куда вы помещаете свои сущности?

#zend-framework #models #doctrine-orm

#zend-framework #Модели #doctrine-orm

Вопрос:

Я использую ZF в Doctrine 2 с ресурсом приложения Bisna, чтобы связать их вместе. До сих пор я помещал свои сущности, прокси, репозитории и уровни обслуживания в свою собственную папку приложения в разделе библиотеки. Так, например, мои сущности будут иметь пространство имен App Entity. Это сработало нормально, но кажется странным, что не все мои объекты находятся в каталоге models макета ZF.

Итак, теперь я пытаюсь переместить все в каталог models, и ZF больше не может найти мои классы. Я убедился, что изменил прокси-сервер и сопоставляющие пространства имен и каталоги в моей конфигурации application.ini, чтобы соответствовать новым местоположениям и пространствам имен (я изменил свое пространство имен entity на просто Entity и внес те же соответствующие изменения для репозиториев и сервисного уровня.

В моем контроллере входа в систему я вызываю UserService:

 $userService = new ServiceUserService($em);
  

Я получаю обратно неустранимую ошибку, в которой говорится, что класс не может быть найден. Есть идеи, чего мне здесь не хватает?

Неустранимая ошибка: класс ‘Service UserService’ не найден…

Пространство имен в моем классе UserService установлено в Service. Этот файл находится в application/models/Service/UserService.php .

 namespace Service;

class UserService
{
...
}
  

Вот несколько фрагментов из моего application.ini, показывающие мои каталоги и пространства имен

 resources.doctrine.orm.entityManagers.default.proxy.namespace = "Proxy"
resources.doctrine.orm.entityManagers.default.proxy.dir = APPLICATION_PATH "/models/Proxy"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.mappingNamespace = "Entity"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.mappingDirs[] = APPLICATION_PATH "/models/Entity"
  

Ответ №1:

Вам нужно добавить Service местоположение пространства имен в автозагрузчик.

Попробуйте что-то подобное в вашем классе Bootstrap

 protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();

    require_once 'Doctrine/Common/ClassLoader.php';

    $serviceAutoloader = new DoctrineCommonClassLoader('Service', APPLICATION_PATH . '/models');
    $autoloader->pushAutoloader(array($serviceAutoloader, 'loadClass'), 'Service');

    return $autoloader;
}
  

Редактировать: У вас, вероятно, уже было что-то, регистрирующее App пространство имен, просто замените это.

Комментарии:

1. Я загружал приложение, используя массив autoloaderNamespaces[] в application.ini. Я не думаю, что это сработает для этого. Я думаю, мне придется поступить так, как вы показали выше. Я попробую.

2. Это помогло — спасибо! Мне пришлось добавить загрузчик классов для всех трех пространств имен — Service, Entity и Repository. Было бы неплохо получить объяснение того, зачем мне это понадобилось хотя бы для Entity. Об этом следовало позаботиться с помощью моего ресурса Doctrine.

3. @Jeremy Ресурс Doctrine настраивает автозагрузчик только для пространства имен Doctrine