2012-02-15 4 views
3

Я пытаюсь точно определить, как реализовать правильное разделение между двумя пакетами в Symfony, и я столкнулся с проблемой доктрины.Расширение базового класса с помощью доктрины, были ли у моего базового класса 1: n ассоциаций

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

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

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

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

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

+0

Проблема, с которой я столкнулся с использованием этого подхода, заключается в том, что если я создам конкретный базовый класс, а затем я попытаюсь обновить мою схему базы данных с помощью консоли (doctrine: schema: update -force), она жалуется что файл сопоставления метаданных объекта отсутствует (конечно, это потому, что я не хочу, чтобы система рассматривала этот объект как объект домена в моей системе). Это может быть уникальным для symfony, но мое обходное решение - просто прокомментировать расширения этих файлов при обновлении моей схемы (очень раздражает). У меня такое чувство, что я что-то упускаю. – calumbrodie

Смежные вопросы