CodeIgniter — повторение кода и передача переменных в функции

У меня есть следующий код в контроллере:

<?php

class Student extends CI_Controller
{

function index()
{
    $data = $this->init->set();
    
    $this->parser->parse('include/header', $data);
    $this->parser->parse('student/student_index', $data);
    $this->parser->parse('include/footer', $data);
}

function planner()
{
    $data = $this->init->set();
    
    $this->parser->parse('include/header', $data);
    $this->parser->parse('student/student_cal', $data);
    $this->parser->parse('include/footer', $data);      
}

}
?>

Как видите, здесь много повторений. В принципе все. Я уже поместил свои переменные в модель, поэтому мне нужно каждый раз вызывать функцию модели вместо того, чтобы помещать весь массив $data в начало каждой функции. Во всяком случае, я попытался уменьшить повторение здесь, выполнив следующие действия:

<?php

class Student extends CI_Controller
{

function index()
{
    $data = $this->init->set();
    
    $this->parser->parse('include/header', $data);
    
    switch($this->uri->segment(2))
    {
        case '': $this->home($data); break;
        case 'planner': $this->planner($data); break;
    }
    $this->parser->parse('include/footer', $data);
}

function home($data)
{
    $this->parser->parse('student/student_index', $data);
}


function planner($data)
{
    $this->parser->parse('student/student_cal', $data);
}

}
?>

Это каким-то образом отлично работает для моей домашней страницы. Он анализирует переменные, и нет никаких проблем. Однако на странице «Планировщик» я получаю ошибки:

Сообщение: Отсутствует аргумент 1 для Student::planner()

Сообщение: Неопределенная переменная: данные

Сообщение: Недопустимый аргумент для foreach()

Я совершенно уверен, что получаю эти ошибки, потому что функция почему-то не получает массив $data. Я также читал в документах CI, что третий сегмент в URL-адресе передается как аргумент, и в этом случае третий сегмент не существует, поэтому ничего не передается. Однако в документах CI не было сказано, как передать массив $data из функции index() в функцию planner(). Мне также интересно, почему домашняя функция работает нормально, без ошибок.


person Joris Ooms    schedule 11.04.2011    source источник


Ответы (2)


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



class Student extends CI_Controller
{

  private function load_student_page($content){
      $data = $this->init->set();

      $this->parser->parse('include/header', $data);
      $this->parser->parse($content, $data);
      $this->parser->parse('include/footer', $data);

  }

  function index()
  {
    $this->load_student_page('student/student_index');
  }

  function planner()
  {
    $this->load_student_page('student/student_cal');
  }

}
person Anther    schedule 12.04.2011

Как вы сказали, CodeIgniter пытается передать третий сегмент в качестве параметра, но его не существует.

Возможно, вам потребуется использовать функцию "_remap.

class Student extends CI_Controller {

    public function _remap($method, $parameters)
    {
         $data = $this->init->set();
         $this->parser->parse('include/header', $data);

         switch($this->uri->segment(2))
         {
             case '': $this->home($data); break;
             case 'planner': $this->planner($data); break;
         }

         $this->parser->parse('include/footer', $data);
    }

}

person TaylorOtwell    schedule 11.04.2011
comment
Хм, я пробовал это, но я не мог заставить его работать. Я думаю, я возьмусь с этим позже; немного потерял время, пытаясь найти здесь другое «решение». Ранее я рассматривал функцию _remap, но на самом деле она не делала то, что я хотел. Возможно, я использовал его неправильно! :) Я посмотрю на это еще раз и, возможно, поищу некоторые шаблоны. Думаю, я действительно не понимаю этот фреймворк :( - person Joris Ooms; 11.04.2011