#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