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

Другие вопросы по тегам