Почему дублирует содержание в классе (для профи ООП)?

Рейтинг: 1Ответов: 1Опубликовано: 09.11.2014

Я написал несколько классов для подготовки информации и отправки ее в родительский класс, для того чтобы получить выходной шаблон HTML:

// Parent class
class FeedTemplate {

  public    $data = array();
    function __construct($data = array()){}

    function getTemplate(){
       return $this->CI->load->view('socialfeed/template', $this->data, true);
    }
}

class ArticleTemplate extends FeedTemplate {

}

class VideoTemplate extends FeedTemplate {
     function __construct($data = array()){
         parent::__construct($data);
     }

     function getTemplate(){
         $this->data['media'] = $this->CI->load->view('video/video_single', $this->data, true);
         parent::getTemplate();
     }
}

Создание объектов:

...
case 'article':
     $obj = new ArticleTemplate($value);
     $this->template.= $obj->getTemplate();
break;

case 'video':
      $video = new VideoTemplate($value);
      $this->template.= $video->getTemplate();
break;
...

Посмотреть шаблон:

<div class="text"><?=$media?><?=$content['text']?></div>

Проблема в $this->data['media'] - содержимое этой переменной дублируется в остальных шаблонах для другого типа информации. Таким образом, создается шаблон для статьи, потом для видео, далее контент от видео добавляется в остальные шаблоны.

Суть в том, что каждый класс формирует объект данных для передачи его родительского класса, тот возвращает собранный шаблон HTML с этими данными. Все шаблоны конкатенируются в одну строку.

Обновление

Смысл в том, что на входе разного типа информация: статьи, новости, видео. В зависимости от этого, информация передается конкретному классу(Article, News. Video), который подготавливает данные $this->data и вызывает метод getTemplate() родительского класса, задача которого эти данные распихать по шаблону и вернуть сам шаблон. Все типовые классы имею одного и того-же родителя FeedTemplate

Обновление

Наследование нужно, чтобы не писать в каждом классе одни и те же методы. Предыдуший мой комментарий, возможно, дает понимание того, что хочу добиться.

Обновление

re: Один и тот же класс не должен одновременно подготавливать данные и заниматься рендерингом. Как раз таки один класс у меня занимается рендерингом, а другие подготавливают данные, а третий - возвращает шаблон. Мешает сделать так, потому как в один класс придется писать кучу переменных и кучу проверок, чтобы эти переменные расфасовать.

Ответы

▲ 2Принят

Если честно, мне вообще непонятна логика этой конструкции и где / в чем вообще ошибка. Наследование шаблонов - это очень правильная штука, но вот реализация ее должна происходить никак не через наследование PHP-классов.

Обновление

информация передается конкретному классу(Article, News. Video), который подготавливает данные ... вызывает метод getTemplate() родительского класса, задача которого эти данные распихать по шаблону и вернуть сам шаблон.

Один и тот же класс не должен одновременно подготавливать данные и заниматься рендерингом. Если родительский класс занимается чем-то принципиально другим, чем рассматриваемый - значит, он родительский исключительно по номиналу.

Но окей, вот он передает. Дальше что? В чем проблема?

Обновление 2

Что мешает сделать так?

$renderer = new Renderer;
$renderer->registerBlock('media');
$renderer->updateData($data);
$renderer->render('путь-к-шаблону')

(я уж молчу про твиг).

Обновление 3

Это извечный вопрос шашечек и езды. Чтобы компонент Х работал, его сначала нужно написать. Можно написать быстро и криво, и это гарантированно аукнется, если только разработка проекта не заканчивается завтра и навсегда. В противном случае надо писать росно столько кода, сколько надо для работы. В текущем варианте весь функционал родительского класса переносится в дочерний, поэтому говорить о том, что этим занимаются разные классы - некорректно, плюс фраза выше про то, является ли родительский класс родительским.

Что до самого вопроса, так media у вас присутствует во всех дочерних классах, потому что это реализуется в функционале родительского. Тут я даже не знаю, что добавить. При желании такое решается через класс-прослойку, MediaFeedtemplate, но вы уже через два дня попадете в адовую цепочку наследующих классов, что явно укажет на изначально плохую архитектуру.