Интеграция ZF / Doctrine2: где я могу поместить классы моделей / объектов и прокси?

если я интегрирую Zend Framework 1.10 с Doctrine 2, где я могу разместить мои модели / объекты и прокси-классы Doctrine? Я думал о каталогах /application или /library . если я поместил в каталог /library tho, будет ли он вмешиваться в классы автозагрузки ZF оттуда, поскольку классы будут использовать пространства имен имен PHP 5.3 или пространства имен типа PEAR.

Solutions Collecting From Web of "Интеграция ZF / Doctrine2: где я могу поместить классы моделей / объектов и прокси?"

Я работаю над приложением, которое также интегрирует Doctrine 2 с ZF1.10. Вам вообще не нужно использовать автозагрузчик Doctrine.

1) В вашем файле application.ini добавьте следующую строку (если у вас установлена ​​Doctrine в вашей папке библиотеки (такая же, как и в папке Zend):

 autoloadernamespaces.doctrine = "Doctrine" 

2) Создайте ресурс doctrine или entitymanager. В вашем файле ini:

 resources.entitymanager.db.driver = "pdo_mysql" resources.entitymanager.db.user = "user" resources.entitymanager.db.dbname = "db" resources.entitymanager.db.host = "localhost" resources.entitymanager.db.password = "pass" resources.entitymanager.query.cache = "Doctrine\Common\Cache\ApcCache" resources.entitymanager.metadata.cache = "Doctrine\Common\Cache\ApcCache" resources.entitymanager.metadata.driver = "Doctrine\ORM\Mapping\Driver\AnnotationDriver" resources.entitymanager.metadata.proxyDir = APPLICATION_PATH "/../data/proxies" resources.entitymanager.metadata.entityDir[] = APPLICATION_PATH "/models/entity" 

3) Затем вам нужно будет загрузить его. Я добавил класс ресурса в папку ресурсов. Убедитесь, что вы переместились в папку в вашем ini-файле:

 pluginPaths.Application_Resource_ = APPLICATION_PATH "/resources" 

Затем ваш класс ресурсов …

 class Application_Resource_EntityManager extends Zend_Application_Resource_ResourceAbstract { /** * @var Doctrine\ORM\EntityManager */ protected $_em; public function init() { $this->_em = $this->getEntityManager(); return $this->_em; } public function getEntityManager() { $options = $this->getOptions(); $config = new \Doctrine\ORM\Configuration(); $config->setProxyDir($options['metadata']['proxyDir']); $config->setProxyNamespace('Proxy'); $config->setAutoGenerateProxyClasses((APPLICATION_ENV == 'development')); $driverImpl = $config->newDefaultAnnotationDriver($options['metadata']['entityDir']); $config->setMetadataDriverImpl($driverImpl); $cache = new Doctrine\Common\Cache\ArrayCache(); $config->setMetadataCacheImpl($cache); $config->setQueryCacheImpl($cache); $evm = new Doctrine\Common\EventManager(); $em = Doctrine\ORM\EntityManager::create($options['db'],$config,$evm); return $em; } } 

Администратор сущности доктрины 2 теперь доступен вашему приложению. В вашем контроллере вы можете захватить его так:

 $bootstrap = $this->getInvokeArg('bootstrap'); $em = $bootstrap->getResource('entitymanager'); 

Я уверен, что это поможет кому-то 🙂

Теоретически, вы можете поместить его куда угодно, если пространства имен будут исправлены.

Я бы предложил эту структуру:

 /application/models/MyApp/Entities /application/models/MyApp/Proxies 

Загрузите «MyApp» с помощью класса ClassLoader Doctrine. У меня не было конфликтов с помощью загрузчика Doctrine с Zend Loader (если у вас есть классы, которые используют соглашение PEAR внутри вашей папки пространства имен, вам все равно придется использовать Zend Loader).

Помните, что «модели» могут быть больше, чем просто ваши классы Entity. Мой модельный слой состоит из интерфейсов, фабрик, валидаторов и объектов обслуживания. С этой целью все, что связано с бизнес-логикой приложения, должно, вероятно, попадать в папку модели.

Я бы поставил Модели в тот же каталог, где «нормальная» Zend Framework моделирует жизнь. /models

Вы можете сказать Doctrine, чтобы генерировать модели в этом месте, и префикс их "Default_Model" или что-то еще.

Просмотрите один из сценариев Джона Лебенсхольда о Zend Framework и доктрине

Zend Screencasts