Доктрина: разрешить расширение сущностей ИППП из стороннего кода - PullRequest
0 голосов
/ 02 ноября 2019

Фон

У меня есть объект A с установленным наследованием одной таблицы и классом Foo, расширяющим его следующим образом:

/**
 * @ORM\Entity()
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap(
 *   "foo" = Foo
 * )
 */
abstract class A 
{
  // ...
}

/**
 * @ORM\Entity()
 */
class Foo extends A 
{ 
  // ...
}

Это работает без проблем. Тем не менее, я должен иметь возможность позволить стороннему коду расширяться A, а также . Проблема: я не знаю отображений дискриминатора, которые были бы необходимы для предварительного соединения, поскольку это свойство базового класса.

Мое текущее решение

Я нахожусь на земле Symfony, поэтому я могу использовать контейнер внедрения зависимостей и украсить annotation_reader* (который обрабатывает аннотации класса карты дискриминатора) своим собственным.

Этот читатель делегирует большинство вызовов исходному, но может расширить найденные аннотации карты дискриминатора. Это делается на основе «реестра расширений», который сам заполняется проходом компилятора в поисках специального тега службы. Любой, кто хочет расширить базовый объект A с помощью Bar, теперь может пометить Bar этим служебным тегом (который также включает в себя идентификатор для сопоставления; в этом примере столбец type).

*) это, вероятно, также будет работать в событии loadClassMetadata - что было бы предпочтительнее, чем украшать читателя

/**
 * @ORM\Entity()
 * @DiscriminatorMapExtension("bar")
 */
class Bar extends A 
{ 
  // ...
}

(я использую служебных аннотаций в приведенном выше примере длябыть в состоянии написать теги непосредственно под аннотацией объекта. Но как именно классы будут зарегистрированы в конце, сейчас не имеет значения. Меня больше интересует общая концепция.)

Так что, если эторабота, в чем проблема?

Мне бы очень хотелось услышать отзывы опытных разработчиков Doctrine об этом подходе, в частности:

  • Есть ли лучший способ добиться «общего»сущность "через связки?
  • Почему этот шаблон может быть проблемой?

Заранее большое спасибо!

...