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

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

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

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

$userService = new Service\UserService($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"

person Jeremy Hicks    schedule 27.04.2011    source источник


Ответы (1)


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

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

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

    require_once 'Doctrine/Common/ClassLoader.php';

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

    return $autoloader;
}

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

person Phil    schedule 27.04.2011
comment
Я загружал приложение, используя массив autoloaderNamespaces [] в application.ini. Я не думаю, что это сработает. Думаю, мне придется поступить так, как вы показали выше. Я попробую. - person Jeremy Hicks; 28.04.2011
comment
Это помогло - спасибо! Мне пришлось добавить загрузчик классов для всех трех пространств имен - Service, Entity и Repository. Было бы неплохо получить объяснение, зачем мне это нужно хотя бы для Entity. Об этом следовало позаботиться с помощью моего ресурса Doctrine. - person Jeremy Hicks; 28.04.2011
comment
@Jeremy Ресурс Doctrine настраивает только автозагрузчик для пространства имен Doctrine - person Phil; 29.04.2011