если я действительно интегрирую Платформу Зенда 1.10 с Доктриной 2, куда я помещаю свои Модели/Объекты Доктрины и Прокси? я думал /application
или /library
каталоги. если я действительно вставляю /library
каталог tho, будет он вмешиваться в ZF классы с автозагрузкой оттуда, так как классы там будут использовать пространства имен PHP 5.3 по сравнению с ГРУШЕВЫМИ пространствами имен стиля.
Я также работаю над приложением, которое интегрирует Doctrine 2 с ZF1.10. Вам вообще не нужно использовать автозагрузчик Doctrine.
1) В файле application.ini добавьте следующую строку (при условии, что Doctrine установлена в папке вашей библиотеки (так же, как папка Zend):
autoloadernamespaces.doctrine = "Doctrine"
2) Создайте ресурс доктрины или 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');
Я уверен, что это кому-то поможет :)
Я бы поместил модели в тот же каталог, где живут «обычные» модели Zend Framework. / models
Вы можете указать Doctrine сгенерировать модели в этом месте и добавить к ним префикс «Default_Model»
или что-то еще.
Посмотрите один из скринкастов Джона Лебенсхолда о Zend Framework и Doctrine
Теоретически, вы можете поместить его куда угодно, при условии, что пространства имен разрешены правильно.
Я бы предложил такую структуру:
/application/models/MyApp/Entities
/application/models/MyApp/Proxies
Загрузите 'MyApp', используя Doctrine's ClassLoader. У меня не было конфликтов при использовании Doctrine loader с Zend Loader (если у вас есть классы, которые используют PEAR конвенцию внутри папки пространства имен, вам все равно придется использовать Zend Loader).
Помните, что "модели" могут быть не только классами Entity. Мой слой модели состоит из интерфейсов, фабрик, валидаторов и сервисных объектов. В связи с этим, все, что является бизнес-логикой, специфичной для приложения, должно быть помещено в папку model.