2013-09-01 1 views
0

У меня есть MY_Controller как родительский класс. Он загружает только представления, передавая им некоторые данные. Мое приложение представляет собой простой веб-сайт с несколькими контроллерами, расширяющими MY_Controller, которые просто устанавливают некоторые переменные, которые содержат информацию, которая должна быть передана в представления.DRY'ing мое приложение

У меня есть один контроллер, который немного отличается от других. Он должен передать больше информации в представления, взятые из базы данных. Что мне делать в этом случае?

Как я вижу, я могу переопределить всю функцию индекса в этом контроллере, но это нарушает правило DRY, потому что единственное различие заключается в установке нескольких значений в мой массив, который передается каждому представлению. Или я могу написать немного LOC в родительском контроллере, но я думаю, что это не очень хорошая практика, поскольку этот дочерний контроллер является единственным контроллером, которому нужен этот код.

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

Мои контроллеры:

 
    class MY_Controller extends CI_Controller 
    { 
     $style='', 
     $contents = array(), 
     $title=''; //and so on 

     public function index() 
     { 
      $data['style'] = $this->style; 
      $data['title'] = $this->title; 

      $this->load->view('header',$data); 

      foreach($this->contents as $row) 
      { 
       $this->load->view($row,$data); 
      } 

      $this->load->view('footer',$data); 
     } 
    } 

Галерея контроллер до сих пор

 
    class Gallery extends MY_Controller 
    { 
     $style = 'galeria.css', 
     $title = 'galeria', 
     $contents = array('content_gallery'); 

     // if $gallery is null, show only all galleries in a list, 
     //else show chosen gallery with its content beneath that list 
     public function index($gallery = NULL) 
     {   
      $data['galleries'] = $this->gallery_model->get_all_active_galleries(); //names and ids 

      if($gallery != NULL) 
      { 
       $data['name'] = ... 
       $data['description'] = ... 

       etc... 
      } 
     } 
    } 

ответ

0

Если вы хотите сделать что-то для каждого метода конкретного контроллера, но не для других контроллеров, то, что вы можете сделать переопределяет конструктор для этого контроллера, как в этом примере:

class Main extends MY_Controller { 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     // Call the constructor of the parent controller 
     parent::__construct(); 

     // Load the session library 
     $this->load->library('session'); 
    } 
} 
?> 

In th например, мы хотим загрузить библиотеку сеанса для каждого метода, поэтому мы переопределяем конструктор для этого контроллера. Сначала мы вызываем конструктор, затем загружаем библиотеку сеансов.

Тот же принцип применяется к любым другим задачам, которые вы, возможно, захотите сделать. Однако имейте в виду, что любые данные, которые вы хотите установить в конструкторе и использовать в другом месте контроллера, должны быть установлены как атрибут модели. Например, если вы хотите получить все продукты, продаваемые магазином с одной из ваших моделей, вам необходимо сохранить его как $this->products, а не $products.

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