Расширение базового класса с использованием доктрины, где мой базовый класс имеет ассоциации 1: n - PullRequest
3 голосов
/ 15 февраля 2012

Я пытаюсь точно понять, как реализовать правильное разделение между двумя пакетами в Symfony, и я столкнулся с проблемой доктрины.

У меня есть два пакета, более общий пакет (полный аннотации)классы) под названием «BaseProduct», а затем реализация этого комплекта (который дает возможность специализировать функциональные возможности этого комплекта) под названием «ClientProduct».

У меня есть два объекта в комплекте «Product», которыесвязанные.

abstract class Product 
{
    // One product has many attributes
    private $attributes;

    private function getAttributes()
    {
        return $this->attributes;
    }
}

abstract class Attribute
{
    private $name;
    private $value;

    private function getName()
    {
        return $this->name;
    }

    private function getValue()
    {
        return $this->value;
    }
}

А затем конкретная реализация

class Product extends BaseProduct/Product
{

}

class Attribute extends BaseProduct/Attribute
{

}

Мой вопрос

Сначала я бы использовал 'mappedSuperclass' дляделайте это, но, читая документы, вы не можете настроить коллекции как ассоциации (понятно) на не конкретных классах.

Я пытаюсь найти другой способ сделать это.

Это дажевозможный?Потому что мой «базовый класс» имеет отношение к другому «базовому классу» (оба абстрактные).В таком случае мне нужно перенести отношения в «конкретную» реализацию или я могу сохранить их на этом уровне (аннотация)?Мои определения сущностей ('.yml') не показаны, но я намерен связать их с конкретными реализациями (где связи между сущностями также находятся между другими конкретными реализациями) и оставить базовые классы без определений сущностей.

Любой ввод приветствуется - цель здесь состоит в том, чтобы создать отделенный пакет, который может быть специализированным.Я уверен, что это довольно общая цель, поэтому мне было бы интересно посмотреть, как это делают другие (если на github есть какие-то пакеты, мне было бы интересно их увидеть).

1 Ответ

1 голос
/ 16 февраля 2012

Я столкнулся с чем-то похожим, и обходной путь, который я использовал, заключался в предоставлении конкретного базового класса, который просто обрабатывается, как если бы он был абстрактным (то есть: базовый класс никогда нигде не создавался).

Если вы хотите применить «абстрактность» вашего базового класса (чтобы другие разработчики не пытались глупо его создать), вы можете вызвать исключение в его конструкторе.

...