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