Почему классы моделей Doctrine, созданные с «A», «B», вызывают сбой, а классы с «X» или «Z» - нет - PullRequest
1 голос
/ 18 августа 2010

Я использую Doctrine вместе с CodeIgniter.

Я не могу точно понять логику того, почему сгенерированные модели из моего YaML, начинающиеся с «А», вылетают.

Например, генерация модели из следующего YaML будет работать нормально:

Pguy:
  columns:
    ptext: string(255)

Аналогично:

Zguy:
  columns:
    ztext: string(255)

будет производить модели / Zguy.php и модели / генерируемые / BaseZGuy.php , которые также работают нормально.

Однако, если я начну свое имя класса с 'A', сгенерированная модель приведет к сбою:

Aguy:
  columns:
    atext: string(255)

Начиная с 'B', происходит то же самое - сбой!

Я не понимаю, почему это так. Код в файлах Zguy.php | BaseZguy.php в точности совпадает с кодом в Aguy.php | BaseAguy.php - за исключением класса и начальной буквы переменной.

Идеи

(Отказ от ответственности: я блондинка)

Ответы [ 3 ]

0 голосов
/ 18 августа 2010

Однажды у меня была такая же проблема. Это было давно, но в моем случае это было связано с тем, что загружаются модели заказов и тот факт, что каждый класс расширяет своего родителя BasicClass. i.e.:

Class A extends BaseA {

}

Учение автоматически загружает классы по алфавиту. В этом случае автозагрузка пытается загрузить класс A, который расширяет класс BaseA, который еще не загружен. Это объясняет, почему все классы, начинающиеся с буквы A, будут аварийно завершать работу, а все классы, имена которых начинаются позже в алфавите, а затем Base, не будут аварийно завершаться.

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

Кстати, при публикации подобной проблемы неплохо было бы добавить несколько дополнительных примеров кода. Теперь людям просто нужно угадать.

0 голосов
/ 20 августа 2010

Спасибо 'Stegeman' и 'smoove666'. Действительно, казалось, что алфавитная автозагрузка моделей вызывала мои проблемы.

Сгенерированные модели оказались в структуре каталогов следующим образом:

./models/Aguy.php
./models/Pguy.php
./models/Zguy.php
./models/generated/BaseAguy.php
./models/generated/BasePguy.php
./models/generated/BaseZguy.php

Таким образом, любое имя класса, начинающееся с буквы перед 'g', будет «падать», поскольку модели Base * в папке generated еще не загружены (т. Е. Aguy.php будет «падать», но Pguy.php и Zguy .php будет работать)

Перемещение всех моделей Base * из папки generated в каталог models частично решило эту проблему. Теперь любой класс, начинающийся с буквы> 'b', будет работать (т. Е. Теперь классы, начинающиеся с C до F, не будут аварийно завершаться, так как модели Base * автоматически загружались ранее).

Чтобы полностью реализовать решение, я поместил все модели Base * в каталог с именем _generated, так как _ стоит перед алфавитом 'a'.

Структура каталогов теперь выглядит следующим образом:

./models/_generated/BaseAguy.php
./models/_generated/BasePguy.php
./models/_generated/BaseZguy.php
./models/Aguy.php
./models/Pguy.php
./models/Zguy.php

Проблема решена - осталось мало волос.

Спасибо за ваш вклад.

редактирование:

Более элегантное решение этой проблемы можно найти по адресу: Почему я не могу создать модель Doctrine с именем 'Album'

Проблема может быть решена путем явного указания Doctrine порядка загрузки каталога, содержащего модели

Doctrine::loadModels(array(APPPATH.'/models/generated', APPPATH.'/models'));

Кредит Сандер Верслуйс

0 голосов
/ 18 августа 2010

Я знаю, что доктрина загружает модели в алфавитном порядке, это может вызвать проблемы с зависимостями, например, ваша модель «Amodel» имеет отношение ManyToMany с вашим «Kmodel», что вызовет проблемы, потому что Kmodel еще не знаетУчение.Это также может произойти с B aseModels.

Помогает ли это?Если нет, то лучше определите «сбой».

...