Интеграция Zend Framework 1.11 с MongoDB с использованием Doctrine ODM - PullRequest
4 голосов
/ 28 марта 2011

Кто-нибудь знает, как интегрировать Zend Framework с Mongo, используя Doctrine 2 beta ODM?Я смотрел видео Zendcast об интеграции с Doctrine 2 ORM для MySQL, но Bisna никогда не обновлялся для поддержки Mongo.

Я думаю, я могу попробовать взломать Bisna, чтобы заставить его работать, но я хотел бы знать, есликто-то другой уже нашел способ заставить его работать.

Ответы [ 2 ]

7 голосов
/ 29 марта 2011

Довольно просто написать Zend Bootstrap Resource .

Вот один из них, который я использую:

<?php

namespace Cob\Application\Resource;

use Doctrine\Common\Annotations\AnnotationReader,
    Doctrine\ODM\MongoDB\DocumentManager,
    Doctrine\MongoDB\Connection,
    Doctrine\ODM\MongoDB\Configuration,
    Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver,
    Doctrine\Common\EventManager;

/**
 * Creates a MongoDB connection and DocumentManager instance
 *
 * @author Andrew Cobby <cobby@cobbweb.me>
 */
class Mongo extends \Zend_Application_Resource_ResourceAbstract
{

    /**
     * @return \Doctrine\ODM\MongoDB\DocumentManager
     */
    public function init()
    {
        $options = $this->getOptions() + array(
            'defaultDB'          => 'my_database',
            'proxyDir'          => APPLICATION_PATH . '/domain/Proxies',
            'proxyNamespace'    => 'Application\Proxies',
            'hydratorDir'       => APPLICATION_PATH . '/domain/Hydrators',
            'hydratorNamespace' => 'Application\Hydrators'
        );

        $config = new Configuration();
        $config->setProxyDir($options['proxyDir']);
        $config->setProxyNamespace($options['proxyNamespace']);
        $config->setHydratorDir($options['hydratorDir']);
        $config->setHydratorNamespace($options['hydratorNamespace']);
        $config->setDefaultDB($options['defaultDB']);

        $reader = new AnnotationReader();
        $reader->setDefaultAnnotationNamespace('Doctrine\ODM\MongoDB\Mapping\\');
        $config->setMetadataDriverImpl(new AnnotationDriver($reader, $this->getDocumentPaths()));

        $evm = new EventManager();
        $evm->addEventSubscriber(new SlugSubscriber());

        return DocumentManager::create(new Connection(), $config, $evm);
    }

    public function getDocumentPaths()
    {
        $paths = array();
        foreach(new \DirectoryIterator(APPLICATION_PATH . '/modules') as $module){
            $path = $module->getPathname() . '/src/Domain/Document';

            if((!$module->isDir() || $module->isDot()) || !is_dir($path)){
                continue;
            }

            $paths[] = $path;
        }

        if(!count($paths)){
            throw new \Exception("No document paths found");
        }

        return $paths;
    }

}

Хотя вам придется обновить getDocumentPaths () метод в соответствии со структурой каталога вашего приложения.

1 голос
/ 29 марта 2011

Я написал свой собственный очень простой плагин и контейнер для ресурсов приложения, используя набор интеграции Guilherme для вдохновения.

Я уверен, что это может быть гораздо более функциональным с точки зрения параметров захвата, ноЯ подумал, что добавлю их по мере необходимости.

См. https://gist.github.com/891415

...