Интеграция ZF/Doctrine2: Куда я помещаю свои Модели/Объекты и Прокси-классы

если я действительно интегрирую Платформу Зенда 1.10 с Доктриной 2, куда я помещаю свои Модели/Объекты Доктрины и Прокси? я думал /application или /library каталоги. если я действительно вставляю /library каталог tho, будет он вмешиваться в ZF классы с автозагрузкой оттуда, так как классы там будут использовать пространства имен PHP 5.3 по сравнению с ГРУШЕВЫМИ пространствами имен стиля.

8
задан Jiew Meng 24 July 2010 в 12:23
поделиться

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');

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

8
ответ дан 5 December 2019 в 18:55
поделиться

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

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

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

Zend Screencasts

0
ответ дан 5 December 2019 в 18:55
поделиться

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

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

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

Загрузите 'MyApp', используя Doctrine's ClassLoader. У меня не было конфликтов при использовании Doctrine loader с Zend Loader (если у вас есть классы, которые используют PEAR конвенцию внутри папки пространства имен, вам все равно придется использовать Zend Loader).

Помните, что "модели" могут быть не только классами Entity. Мой слой модели состоит из интерфейсов, фабрик, валидаторов и сервисных объектов. В связи с этим, все, что является бизнес-логикой, специфичной для приложения, должно быть помещено в папку model.

1
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: