2010-11-09 3 views
1

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

[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://[email protected]/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 

Вот моя Доктрина функция от моего 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_');

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

+0

Кроме того, если я попробуйте и запустите doctrine build-all-reload (вместо того, чтобы просто генерировать модели с помощью generate-models-yaml), я получаю сообщение об ошибке «Не удалось найти класс Model_User». Таким образом, некоторые из них знают, что имена классов должны но другая часть не создает их правильно. –

ответ

1

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

+0

Было бы намного проще, если бы вы использовали [ZFDoctrine] (https://github.com/beberlei/zf-doctrine) – takeshin

+0

Я посмотрел на ZFDoctrine, и это казалось, излишним для того, что я пытался сделать, однако, похоже, это хорошее решение. –

Смежные вопросы