Проблемы интеграции Zend Framework и Doctrine - PullRequest
1 голос
/ 09 ноября 2010

Я делал это раньше на другой машине, и настройки почти идентичны. Тем не менее, его просто не работает на новой машине. Когда я пытаюсь заставить Доктрину генерировать мои модели, я помещаю их в неправильное место. Это создает дополнительный каталог «Model» как для базовых классов, так и для обычных классов. Я использую Doctrine 1.2.3 с ZF 1.11.0. Вот мой ZF application.ini:

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
phpSettings.date.timezone = "America/Denver"
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = ""

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.view[] = 

autoloaderNamespaces[] = "Doctrine_"
autoloaderNamespaces[] = "App_"

doctrine.connection_string = "mysql://root@localhost/mydb"
;doctrine.cache = true

doctrine.data_fixtures_path = APPLICATION_PATH "/doctrine/data/fixtures"
doctrine.sql_path = APPLICATION_PATH "/doctrine/data/sql"
doctrine.migrations_path = APPLICATION_PATH "/doctrine/migrations"
doctrine.yaml_schema_path = APPLICATION_PATH "/doctrine/schema"
doctrine.models_path = APPLICATION_PATH "/models"

doctrine.generate_models_options.pearStyle = true
doctrine.generate_models_options.generateTableClasses = true
doctrine.generate_models_options.generateBaseClasses = true
doctrine.generate_models_options.baseClassPrefix = "Base_"
doctrine.generate_models_options.baseClassesDirectory =
doctrine.generate_models_options.classPrefixFiles = false
doctrine.generate_models_options.classPrefix = "Model_"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

Вот моя функция Doctrine из моего файла ZF Bootstrap.php:

protected function _initDoctrine()
{
    $this->getApplication()->
        getAutoloader()->
        pushAutoloader(array('Doctrine_Core', 'autoload'));

    $config = $this->getOption('doctrine');

    $manager = Doctrine_Manager::getInstance();
    $manager->setAttribute(Doctrine_Core::ATTR_MODEL_CLASS_PREFIX, 'Model_');
    $manager->setAttribute(Doctrine_Core::ATTR_MODEL_LOADING, Doctrine_Core::MODEL_LOADING_PEAR);
    $manager->setAttribute(Doctrine_Core::ATTR_VALIDATE, Doctrine_Core::VALIDATE_ALL);
    $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
    $manager->setAttribute(Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true);
    $manager->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
    $manager->setAttribute(Doctrine_Core::ATTR_AUTOLOAD_TABLE_CLASSES, true);

    if (isset($config['cache']) && $config['cache'] == true) {
        $cacheDriver = new Doctrine_Cache_Apc();
        $manager->setAttribute(Doctrine_Core::ATTR_QUERY_CACHE, $cacheDriver);
    }

    $connection = $manager->openConnection($config['connection_string'], 'doctrine');
    $connection->setAttribute(Doctrine_Core::ATTR_USE_NATIVE_ENUM, true);
    $connection->setCharset('utf8');

    return $connection;
}

А вот мой сценарий командной строки doctrine.php:

// 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'),
    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');

$config = $application->getOption('doctrine');
$cli = new Doctrine_Cli($config);
$cli->run($_SERVER['argv']);

Итак, я ожидаю, что каталог моей модели будет выглядеть так:

models
  Base
    -Class1.php
    -Class2.php
  -Class1.php
  -Class1Table.php
  -Class2.php
  -Class2Table.php

где имена классов базовых классов отформатированы как Model_Base_Class1, а имена обычных классов - Model_Class1 (в самих файлах php). Вместо этого я получаю:

models   
  Base
    Model
      -Class1.php
      -Class2.php   Model
    -Class1.php
    -Class1Table.php

Видите дополнительные каталоги моделей? Чем это вызвано? Я попытался поэкспериментировать с параметром doctrine.generate_models_options.classPrefix в моем ini, а также с похожим параметром в моем файле Bootstrap.php - $ manager-> setAttribute (Doctrine_Core :: ATTR_MODEL_CLASS_PREFIX, 'Model _');

Пожалуйста, помогите мне!

1 Ответ

1 голос
/ 09 ноября 2010

Ну, я опять не такой умный. :( Все, что было, было неверной конфигурацией моего файла schema.yaml. Я поместил Model_User в качестве имени модели, а не просто User! Для файла приспособлений требуется именно Model_User. Проблема решена.

...