Zend Framework 1.11 + Doctrine 2 + Проблемы с отображением наследования классов (YAML) при создании объектов
Я получаю ряд проблем, пытаясь реализовать CTI
Прежде всего я использую пользовательский загрузчик для своих классов сущностей
class My_AutoLoader implements Zend_Loader_Autoloader_Interface
{
public function autoload($class)
{
$class = trim(str_replace('\\', '/', $class), '/');
if (@include(APPLICATION_PATH . '/Entities/' . $class . '.php')) {
return $class;
} else {
throw new Zend_Loader_Exception('Cannot load ' . $class . '.');
}
}
}
Идея состоит в том, чтобы использовать application\Entities
для классов, которые не имеют пространства имен, как $user = new Users();
Тогда я определил наследование классов
Profiles:
type: entity
table: profiles
repositoryClass: Repositories\Base
inheritanceType: JOINED
discriminatorColumn:
name: profiletype
type: integer
length: 11
discriminatorMap:
1: Personal
2: Work
3: Business
id:
id:
type: integer
generator:
strategy: AUTO
fields:
firstname:
type: string
length: 255
fixed: false
nullable: true
...
Work:
type: entity
table: work
repositoryClass: Repositories\Base
fields:
position:
type: string
length: 255
fixed: false
nullable: true
Затем я вручную создал класс Работа для расширения профилей
class Work extends Profiles
{
}
Первая проблема началась с 2.0.0 (2.0.1), когда я использую генерируемые сущности консольного инструмента, я получаю сообщение об ошибке, что у меня нет идентификаторов для Work
класс, это странно, потому что ИМХО это противоречит идее Work
продолжается Profiles
а также id
уже определено.
Однако я попытался добавить столбец id
для Work
класс, но потом я получаю сообщение, что у меня уже есть столбец id
, DOH!
Я попытался добавить другое имя столбца для PK, но на самом деле я получил дополнительный столбец, который не нужен, потому что правильный унаследованный столбец id
также создан. В CTI у меня должен быть один столбец FK, и нет других PK с автоматически сгенерированными значениями.
Поэтому я сделал плохую вещь, чтобы взломать классы доктрин и убрать проверки на отсутствие идентификаторов. Ужасно, но это сработало. Сущности начинают генерироваться правильно, и структура БД в порядке.
Позже я обнаружил, что все это странное поведение связано с ошибкой в доктрине 2, и она исправлена в 2.0.5.
Ну, я попробовал 2.0.5 и у меня была точно такая же проблема, поэтому я подумал, что ошибка в моем коде.
Я отправил сообщение об ошибке в jira доктрины, и мне ответили, что мои определения неверны, и мне нужны идентификаторы для подклассов (и получил ссылку на документацию, что все, что мы знаем, довольно плохо, особенно для отображения YAML). Я сдался и придерживался своего хака.
Позже я попробовал с 2.0.6 и 2.1, но с этими версиями мои сущности больше не обновляются, но каждый раз, когда я использую generate-entity, новые определения классов добавляются в конец, поэтому появляются дубликаты.
Мой вопрос:
Это проблема с доктриной или я делаю это неправильно?
Если это во мне, что является правильным способом отображения CI
1 ответ
Взято из вашего вопроса:
Обновление: я обнаружил, что проблема на самом деле заключается в ошибке в Doctrine, которая всегда префиксует пространство имен с "\" при обновлении сущностей, и мой пользовательский автозагрузчик загружает только классы без пространства имен. Кроме того, есть ошибка с наследованием свойств (идентификаторов)
Оба будут исправлены в 2.1.1