ZF2 + Doctrine 2 - Дискриминаторы на уровне детей с наследованием таблиц классов
В SO и во всем Интернете много говорится о ZF2 с Doctrine 2 и использовании дискриминаторов: как не объявить все дочерние сущности в родительской сущности? Особенно, когда у вас есть несколько модулей?
Короткий ответ: не объявляйте discriminatorMap
, Доктрина справится с этим за вас.
Более длинный ответ ниже.
1 ответ
Это популярная статья о том, как иметь возможность объявлять ваши дочерние сущности в дочерних сущностях, а не в родительской.
Однако Доктрина 2 несколько изменилась с момента ее написания, например,AnnotationWriter
более не существует.
Однако, как я уже упоминал в этом вопросе, существует более простой способ: ничего не делать.
Теперь использовать дискриминаторы с использованием метода " Наследование таблиц классов" (в отличие от "Наследования отдельных таблиц") означает НЕ ОБЪЯВЛЯТЬ карту дискриминатора! (Не уверен, что это также будет работать для ИППП...)
Я нашел старый билет на Github, который объясняет ту же проблему, что и этот ответ, и который до сих пор есть у многих людей, что объявление родителя не имеет смысла. Прочитав это, я тщательно изучил код и перечитал документы.
Кроме того, если вы читаете документы очень осторожно, это говорит о том, что это возможно, если не говорить об этом.
Цитирование:
Что следует отметить:
@InheritanceType, @DiscriminatorColumn и @DiscriminatorMap должны быть указаны в самом верхнем классе, который является частью отображаемой иерархии сущностей.
@DiscriminatorMap указывает, какие значения столбца дискриминатора идентифицируют строку как имеющую тип. В приведенном выше случае значение "person" идентифицирует строку как тип Person, а "employee" идентифицирует строку как тип Employee.
Имена классов в карте дискриминатора не должны быть полностью квалифицированными, если классы содержатся в том же пространстве имен, что и класс сущностей, к которому применяется карта дискриминатора.
Если карта дискриминатора не указана, карта генерируется автоматически. Автоматически сгенерированная карта дискриминатора содержит в качестве ключа краткое имя каждого класса в нижнем регистре.
Конечно, вышеупомянутая часть документации явно заявляет, что картабудет сгенерирована, если не была предоставлена ни одна. Хотя это противоречит первой вещи, на которую стоит обратить внимание: @DiscriminatorMap
должен быть предоставлен на верхнем классе в иерархии.
Итак, если вы хотите расширить ваши классы на несколько модулей (как я полагаю, именно поэтому вы и читаете это), не объявляйте карту дискриминатора!
Я оставлю вам пример ниже:
<?php
namespace My\Namespace\Entity;
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* // NOTE: No @DiscriminatorMap!!!
*/
class Person
{
// ...
}
<?php
namespace My\Other\Namespace\Entity;
/** @Entity */
class Employee extends \My\Namespace\Entity\Person
{
// ...
}
Когда вы используете команду командной строки doctrine для проверки ваших сущностей, вы обнаружите, что это правильно.
Также проверьте, что он полностью работает, используя команду проверки сущности:
./vendor/bin/doctrine-module orm:mapping:describe “\My\Namespace\Entity\Person”
В верхней части ответа этой команды будет следующая строка:
| Discriminator map | {“person”:”My\\Namespace\\Entity\\Person”,”employee”:”My\\Other\\Namespace\\Entity\\Employee”}