Интеграция ZF / Doctrine2: куда я могу поместить мои классы Models / Entities и Proxy - PullRequest
8 голосов
/ 24 июля 2010

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

Ответы [ 3 ]

8 голосов
/ 27 августа 2010

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

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

autoloadernamespaces.doctrine = "Doctrine"

2) Создать учение или ресурс управления сущностями. В вашем 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;
    }
}

Менеджер сущностей doctrine 2 теперь доступен для вашего приложения. В вашем контроллере вы можете взять его так:

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

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

1 голос
/ 25 июля 2010

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

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

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

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

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

0 голосов
/ 25 июля 2010

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

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

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

Zend Screencasts

...