Неустранимая ошибка с Doctrine при использовании generate.php - PullRequest
0 голосов
/ 22 июля 2010

Я работаю над учебником Doctrine по адресу http://www.Doctrine -project.org / и получаю фатальную ошибку, когда пытаюсь запустить сценарий 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)

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

Ответы [ 2 ]

1 голос
/ 23 июля 2010

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

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

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

Doctrine::loadModels('path/to/your/models/generated'); 
Doctrine::loadModels('path/to/your/models/custom');    
Doctrine::loadModels('path/to/your/models'); 
0 голосов
/ 23 июля 2010

Нашел это:

http://www.doctrine -project.org / JIRA / просмотр / DC-344

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

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

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

Теперь я думаю, порядок файлов возвращено RecursiveIteratorIterator не всегда одно и то же (зависит от ОС, имена файлов и космическое излучение), но самое главное, что файлы классов из «модулей / сгенерированные» каталог (как в примерах) НЕ включены до получения подклассов из сгенерированных классов. Это означает что Doctrine_Core :: autoload () не работает загружать классы из каталог «модули / сгенерированный», точно эта проверка не проходит:

if (0! == stripos ($ className, 'Doctrine_') || class_exists ($ className, false) || interface_exists ($ className, false))

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

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

БЫСТРЫЙ ВОЗМОЖНЫЙ РЕШЕНИЕ: как быстро Обходной путь Я изменил параметры в вызов метода createTablesFromModels () для:

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

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

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

...