Использование Doctrine 2 с Zend Framework 1.10.x - PullRequest
3 голосов
/ 14 июля 2010

как мне начать работать с Doctrine 2 + ZF? какие-либо учебники или ресурсы?

на заметку, я слышал, ZF2 будет использовать Doctrine в качестве модели, верно?

Ответы [ 2 ]

3 голосов
/ 14 июля 2010

Что приятно для работы с ZF и Doctrine 2, так это то, что для их интеграции нужно сделать очень мало.По сути, вам просто нужен доступ к экземпляру Doctrine 2 EntityManager, который настроен во время начальной загрузки приложений, а также убедитесь, что пространства имен Doctrine загружаются в ваш index.php (для этого вам потребуется использовать ClassLoader Doctrine, Zend_Loader пока не поддерживает пространства имен).

Вы можете создать экземпляр EntityManager вручную в начальной загрузке или, что еще проще, с помощью Resource Plugin (который облегчает хранениеконфигурация базы данных в application.ini).Вы можете в значительной степени следовать документации по настройке и получению Entity Manager в руководстве Doctrine, и просто иметь метод init() в вашем ресурсе начальной загрузки, возвращающий экземпляр.

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

Я использую Doctrine 2 с ZF, поскольку он находится в альфа-версии,и было приятно работать с ним.

2 голосов
/ 23 июля 2010

Я могу привести несколько примеров из файла bootstrap.php, который я использую:

    public function _initDoctrine() {
                if(PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3) {
                    require_once('bootstrapDoctrine.inc.php');

                    //things below this line are for convenience        
                    require_once(dirname(__FILE__).'/../library/doctrinehelpers/requireEntitiesOnce.php');
                    Zend_Registry::set('doctrineEm', $em);
                    return $em;
                }
        }

И в boostrapDoctrine.inc.php у меня есть это:

use Doctrine\Common\ClassLoader,
    Doctrine\ORM\Configuration,
    Doctrine\ORM\EntityManager,
    Doctrine\Common\Cache\ArrayCache,
    Doctrine\DBAL\Logging\EchoSQLLogger;

    require_once(realpath(APPLICATION_PATH . '/../library').'/doctrine2/lib/Doctrine/Common/ClassLoader.php');

    $doctrineClassLoader = new ClassLoader('Doctrine', realpath(APPLICATION_PATH . '/../library').'/doctrine2/lib');
    $doctrineClassLoader->register();


    //no way to have your proxies generated in different directory per ZF module it seems so we use a global one
    $proxiesClassLoader = new ClassLoader('Proxies', realpath(APPLICATION_PATH . '/models/doctrineproxies'));
    $proxiesClassLoader->register();

    /*
     * @TODO make this step iterate over available modules
     */
        $driverImpl = $config->newDefaultAnnotationDriver(array(APPLICATION_PATH . '/modules/mymodule1/models/doctrineentities',APPLICATION_PATH . '/modules/mymodule2/models/doctrineentities'));
    $config->setMetadataDriverImpl($driverImpl);
    $config->setMetadataCacheImpl($cache);
    $config->setQueryCacheImpl($cache);

    // Proxy configuration
    $config->setProxyDir(realpath(APPLICATION_PATH . '/models/doctrineproxies'));
    $config->setProxyNamespace('Proxies');


    /**
     * this SQL logger is golden
         * @TODO implement a switch for verbose debugging
     */ 

     //   $logger = new Doctrine\DBAL\Logging\DebugStack();
     //   $config->setSQLLogger($logger);
     //   register_shutdown_function(function($logger) {
     //       echo '<pre>';
     //       print_r($logger->queries);
     //   }, $logger);


    $config->setAutoGenerateProxyClasses( true ); //disable in production environment

    $doctrineConfig = $this->getOption('resources'); //from ini
    $dbparams = $doctrineConfig['db']['params'];
    $connectionOptions = array(
         'driver'    => $doctrineConfig['db']['adapter'],
         'user'      => $dbparams['username'],
         'password'  => $dbparams['password'],
         'dbname'    => $dbparams['dbname'],
         'host'      => $dbparams['host']
    );
    $em = EntityManager::create($connectionOptions, $config); //stored in zend registry later

Чтобы позволить инструменту командной строки doctrine работать, мне пришлось создать библиотеку / doctrine2 / lib / cli-config.php, которая также является урезанным загрузочным модулем Zend Framework. Этот конфиг имеет тот недостаток, что мне приходится вызывать доктрину cli из этого каталога. У меня работает;)

/*
* @TODO make the cli-tool more flexible by better path detection
*/
// Define path to application directory
defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    realpath(APPLICATION_PATH . '/../../include'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);


$    application->getBootstrap()->bootstrap('doctrine');
$em = $application->getBootstrap()->getResource('doctrine');

/*
$configuration = new \Doctrine\Common\Cli\Configuration();
$configuration->setAttribute('em', $em);
*/

$helperSet = new \Symfony\Components\Console\Helper\HelperSet(array(
    'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
    'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));

Теперь мы все надеемся на лучшую интеграцию доктрины, но это произойдет только в ZF 2, сделав большой шаг к пространствам имен, как доктрина уже сделала.

Надеюсь, я смогу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...