Zend Framework 1.11 + Doctrine 2 + Проблемы с отображением наследования классов (YAML) при создании объектов - PullRequest
2 голосов
/ 27 июня 2011

Я получаю ряд проблем, пытаясь реализовать 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), когда я использую консольный инструмент generate-entity Я получаю ошибку, что У меня нет идентификаторов для 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 Ответ

0 голосов
/ 16 сентября 2011

Взято с вашего вопроса:

Обновление: Я обнаружил, что проблема на самом деле заключается в ошибке в Doctrine, которая всегда префиксует пространство имен с "\" при обновлении сущностей, и мой пользовательский автозагрузчик загружает только классы без пространства имен. Кроме того, есть ошибка с наследованием свойств (идентификаторов)

Оба будут исправлены в 2.1.1

...