Как заставить Zend распознать пути к Propel ORM - PullRequest
1 голос
/ 23 марта 2011

Я пытаюсь заставить Propel работать в моем приложении Zend, похоже, что я могу заставить библиотеку Propel загружаться (из библиотеки / propel), но при вызове я получаю исключение: «Нет информации о соединении в вашем файле конфигурации времени выполнения для источника данных [по умолчанию] '(когда я пытаюсь установить соединение:' Propel :: getConnection '). Мой Db даже не назван «по умолчанию». У меня есть это в моем bootstrap.php от другого ТАК вопрос / ответ:

           require_once 'propel/Propel.php';
       Propel::setConfiguration($this->getOptions('propel/MyPropel-conf.php'));
       Propel::initialize();

       // so we can get the connection from the registry easily
       return Propel::getConnection();

Я хочу, чтобы конфиги Propel (также и classmap conf) находились в '/ application / configs' (копии тоже есть сейчас), но я подумал, что если я смогу заставить Propel загружаться из библиотеки / propel, то, возможно, перемещая мои файлы 'conf' туда, я могу заставить их загружаться тоже. Похоже, что если я «форсирую» конфигурацию, вручную загружая параметры, или если мне кажется, что я получаю ее во временном «правильном» месте (или использую абсолютный путь), я получаю исключение: 'Невозможно открыть соединение PDO [wrapped: SQLSTATE [28000] [1045] Доступ запрещен для пользователя' www-data '@' localhost ' Как будто Propel не обращает никакого внимания на мои конфиги. Мой конфиг выглядит так; конвертируется из xml:

    $conf = array (
  'datasources' => 
  array (
    'unmActTestDB' => 
    array (
      'adapter' => 'mysql',
      'connection' => 
      array (
        'dsn' => 'mysql://root:PASSWORD@localhost/unmActTestDB',
      ),
    ),
    'default' => 'unmActTestDB',
  ),
  'log' => 
  array (
    'ident' => 'propel-act',
    'level' => '7',
  ),
  'generator_version' => '1.5.6',
);
$conf['classmap'] = include(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classmap-unmActTestDB-conf.php');
return $conf;

Если это поможет, у меня все еще есть загрузка адаптера Zend PDO DB в файле application.ini, это вызовет конфликт? Есть ли стандартный способ заставить Propel работать с Zend? Или кто-нибудь может увидеть, что я делаю не так?

Я был на нескольких постах здесь на SO, и на нескольких популярных постах, таких как эта Приключения слияния Propel с Zend Framework и этой в зоне разработки Zend Интеграция Propel с Zend Framework , в том числе Propel Docs. Они были полезны, но я действительно борюсь с этим. Заранее спасибо! Моя текущая структура Zend Directory выглядит следующим образом (с двумя конфами propel также в папке library / propel:

Directory Structure

1 Ответ

2 голосов
/ 31 марта 2011

То, что я в итоге сделал, это:

Я получил хорошее представление о том, как генерировать мои модели из «реверса» с помощью Propel. Он создал (как и раньше) файл «schema.xml», чтобы я мог создавать свои модели с помощью.

Также мой файл 'runtime.xml' был неправильным для моих нужд, после сборки я не подключался к нужной базе данных из-за пропуска нескольких тегов, но в целом это довольно просто:

    <?xml version="1.0" encoding="UTF-8"?>
<config>
 <log>
  <ident>unmActTestDB</ident>
  <level>7</level>
 </log>
 <propel>
  <datasources default="unmActTestDB">  
   <datasource id="unmActTestDB">
    <adapter>mysql</adapter>    
    <connection>
    <dsn>mysql:host=localhost;dbname=unmActTestDB</dsn>
    <user>zend</user>
    <password>PASSWORD</password>
    <database>unmActTestDB</database>
    </connection>    
   </datasource>   
  </datasources> 
 </propel>
</config>

Тег 'dsn' должен быть в вышеуказанном формате с добавлением тегов 'user', 'password' и 'database'. Это исправило мою проблему с ошибками соединения с базой данных. Как указано выше (и здесь), было сгенерировано исключение: «В вашем файле конфигурации времени выполнения нет информации о соединении для источника данных [по умолчанию]»

Что касается загрузки моих моделей, я положил их в свою папку 'library', у меня уже есть автозагрузка этой папки в моем приложении, плюс она казалась хорошим местом для них.

вот изображение моей «обновленной» структуры каталогов: My directory structure w/ Propel models

Обратите внимание на добавление папки 'unmActTestDB' в мой каталог, это мои модели ORM. Еще одна вещь, которую стоит отметить, это то, что я поместил мои сгенерированные файлы conf в папку application / configs. Теперь они верны, после исправления файла runtime.xml и «перестроения».

В качестве примечания мне пришлось вручную отредактировать файл 'schema.xml' (несколько раз :)) ... В исходной базе данных использовались множественные имена таблиц, поэтому я отредактировал все объявления 'phpname' ( атрибуты на самом деле в теге объявления) должны быть единичными, чтобы я не мог получить доступ к объекту «Пользователи» ... вместо этого теперь я могу получить доступ к объекту «Пользователь». Я сохранил имена таблиц одинаковыми (таблицы множественные, и у меня не возникнет проблем с импортом существующих данных и т. Д.) Это было предложено ответом на другой мой вопрос, см. Здесь Как связаться Объект Propel ORM .

Другим важным изменением, которое я сделал, было добавление объявлений первичного ключа (опять же, атрибутов) для многих представлений SQL в БД, также я добавил атрибуты «только для чтения» и «noSQL» в объявления, так что я буду иметь доступ (через модели Propel) к моим представлениям.

И, если быть точным, и для тех, кто интересуется здесь, это дополнение к моему файлу «bootstrap.php», которое выполняет мой «Propel Init» для меня ...

protected function _initPropel()
        {
            $this->_logger->info('Bootstrap ' . __METHOD__);

            require '../library/propel/Propel.php';
            Propel::init(APPLICATION_PATH . '/configs/unmActTestDB-conf.php');
            Propel::initialize();

            return Propel::getConnection();
        }

Другое примечание: '$ this -> _ logger-> info (' Bootstrap '. METHOD );' вызывает мой метод 'logging', который просто сообщает 'firePHP', что этот метод загружен. /Configs/unmActTestDB-conf.php 'вызывает второй' conf 'файл, который генерирует Propel ... и вот' исправленная 'версия этого файла (файл unmActTestDB.conf). Обратите внимание на изменения в' массив соединений.

<?php
// This file generated by Propel 1.5.6 convert-conf target
// from XML runtime conf file runtime-conf.xml
$conf = array (
  'datasources' => 
  array (
    'unmActTestDB' => 
    array (
      'adapter' => 'mysql',
      'connection' => 
      array (     
        'dsn' => 'mysql:host=localhost;dbname=unmActTestDB',
        'user' => 'zend',
        'password' => 'PASSWORD', 
        'database' => 'unmActTestDB', 
      ),
    ),
    'default' => 'unmActTestDB',
  ),
  'log' => 
  array (
    'ident' => 'unmActTestDB',
    'level' => '7',
  ),
  'generator_version' => '1.5.6',
);
$conf['classmap'] = include(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classmap-unmActTestDB-conf.php');
return $conf;

Я ухожу и бегу сейчас! Это был отличный способ, в противном случае я искал и писал ооочень много картографических классов для своего приложения. Propel (в настоящее время) создает более 300 моделей для этого приложения! Плюс базовые классы, это заняло бы у меня вечность ...

...