2010-07-22 4 views
0

Я работаю над учебником Doctrine по адресу http://www.Doctrine-project.org/ и получаю фатальную ошибку при попытке запустить сценарий generate.php, который делает мои модели и делает таблицы в базе данных:Неустранимая ошибка с доктриной при использовании generate.php

Fatal error: Class 'BaseCharity' not found in ...\models\Charity.php on line 14 

generate.php:

require_once('bootstrap.php'); 
Doctrine_Core::dropDatabases(); 
Doctrine_Core::createDatabases(); 
Doctrine_Core::generateModelsFromYaml('schema.yml', 'models'); 
Doctrine_Core::createTablesFromModels('models'); 

и schema.yml

Charity: 
    actAs: [Timestampable] 
    columns: 
    active: 
     type: boolean 
     default: '1' 
    owed: decimal(32,2) 
    totalPayed: decimal(32,2) 
    name: string(255) 
    website: string(255) 
    description: text 
    icon: string(255) 

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

ответ

1

Необходимо авторизоваться на автозагрузке предоставленной Doctrine. Нет необходимости использовать какие-либо итераторов или, что так всегда

Doctrine::loadModels('path/to/your/models'); 

Вы, конечно, можете использовать его sevaral раз:

Doctrine::loadModels('path/to/your/models/generated'); 
Doctrine::loadModels('path/to/your/models/custom');  
Doctrine::loadModels('path/to/your/models'); 
0

Нашел:

http://www.doctrine-project.org/jira/browse/DC-344

Привет, я наткнулся на то же проблемы, и я думаю, что я знаю, где вопрос.

So Doctrine_Core :: createTablesFromModels() называет Doctrine_Export :: exportSchema() , который в свою очередь вызывает Doctrine_Core :: loadModels().

Doctrine_Core :: loadModels() использует RecursiveIteratorIterator и выполняет итерации поверх всех найденных файлов.

Теперь я думаю, что порядок файлов возвращаемых RecursiveIteratorIterator не всегда одинаков (зависит от операционной системы, имен файлов и космической радиации), но самого главного здесь в том, что файлов классы из «модулей/генерироваться ' каталог (как в примерах) ARE NOT , включенный в подклассы, полученные из сгенерированных классов. Это означает, что Doctrine_Core :: автозагрузку() терпит неудачу загружать классы из 'модулей/генерируемой' директории, именно эта проверка терпит неудачу:

, если (0 == stripos ($ Classname, 'Doctrine_') || class_exists ($ ИмяКласса, ложно) || interface_exists ($ ИмяКласса, ложь))

, как базовый класс не начиная с 'Doctrine_' и еще не загружен.

Чтобы исправить это правильно алгоритм модулей загрузки должно быть изменено на первым относится «модули/генерироваться» классов и затем остальных классов. Я не уверен, но, возможно, Core :: autoload() может быть изменен, чтобы включить базовые классы .

БЫСТРОЕ РЕШЕНИЕ: Как быстро обходного Я изменил параметры вызова createTablesFromModels(), чтобы:

Doctrine_Core :: createTablesFromModels (массив ('модель/сгенерированные', 'модели'));

as createTablesFromModels() может принимать массив каталогов.

Надеюсь, это поможет вам, пожалуйста, дайте мне , если вам нужна дополнительная информация. Спасибо!

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