2009-06-10 3 views
4

Я заинтересован в использовании Doctrine как ORM для нового приложения Zend Framework, которое я пишу. Я пытаюсь понять, как лучше всего интегрировать его как можно более прямолинейно. Каждый пример, который я нахожу, отличается, и многие из них предваряют новые функции автозагрузки в ZF 1.8. Никто из них не работал для меня.Интеграция доктрины с Zend Framework 1.8 app

У кого-нибудь есть хороший способ сделать это? Я склонен захотеть поместить его в свой загрузочный файл, но некоторые люди предлагают создать плагин Zend_Application_Resource. Жесткая часть, похоже, правильно загружает пути загрузки как для пространства имен Doctrine, так и для классов моделей, которые по умолчанию не соответствуют соглашению о автоматической загрузке Zend.

Любые мысли? Благодарю.

ответ

3

Я написал Resource Bootstrapper для Doctrine и Zend Framework несколько недель назад и превратил все это в небольшую оболочку, потому что я думаю, что ZF и Doctrine - отличная команда. Вы можете прочитать статью здесь: http://coffeecoders.de/2009/06/using-the-zend-framework-18-bootstrapper-and-doctrine-110/

Он полностью настраивается с помощью конфигураций ресурсов Bootstrap (например, включены, тоже). К сожалению, Doctrine ищет модели в папке модели с тем же именем класса, что и имя файла (что не соответствует схеме именования ZF), поэтому на самом деле невозможно избавиться от регистрации автозагрузчика Doctrine. Загрузчик ресурсов выглядит следующим образом:

<?php 
/** 
* Doctrine model loading bootstrap resource. Options must provide a connection string. 
* directory option for model directory is optional (default is ./models). 
* Further options will be set for the Doctrine manager via setAttribute (e.g. model_loading). 
* @author daff 
*/ 
class Cuckoo_Application_Resource_Model extends Zend_Application_Resource_ResourceAbstract 
{ 
    public function init() 
    { 
     $manager = Doctrine_Manager::getInstance(); 
     $options = $this->getOptions(); 

     foreach($options as $key => $value) 
     { 
      if($key != 'connection' && $key != 'directory') 
        $manager->setAttribute($key, $value); 
     } 

     if(empty($options['connection'])) 
      throw new Exception("No database connection string provided!"); 
     Doctrine_Manager::connection($options['connection']); 
     if(empty($options['directory'])) 
      $dir = './models'; 
     else 
      $dir = $options['directory']; 
     Doctrine::loadModels(realpath($dir)); 
     return $manager; 
    } 
} 
+0

Спасибо. В итоге я пошел с подобным подходом. Мэтью Лурц написал [предложение] (http://framework.zend.com/wiki/display/ZFPROP/Zend_Application_Resource_Doctrine+-+Matthew+Lurz) для плагина ресурса ZendX. Он вставил некоторые исходные [спецификации] (http://pastie.org/481635) и [код] (http://pastie.org/481633). Это похоже на то, что у вас есть, и решил мои проблемы. –

0

Что касается автозагрузки, вы можете довольно эффективно использовать загрузчик Doctrine с новым стеком Zend_Loader_Autoloader. Взгляните на this page, особенно там, где упоминается метод pushAutoloader().

Вот основной обыгрыш, хотя:

$autoloader = Zend_Loader_Autoloader->getInstance(); 
$autoloader->pushAutoloader(array('Doctrine', 'autoload'), 'Doctrine'); 

Это будет использовать собственный автозагрузчик Doctrine для только классов, которые начинаются с доктриной, если они еще не найдены другими автопогрузчиков в стеке.

Надеюсь, это поможет.