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

#php #codeigniter #codeigniter-2

#php #codeigniter #codeigniter-2

Вопрос:

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

 <?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);      
}

}
?>
  

Как вы можете видеть, здесь много повторений. В основном все это. Я уже поместил свои переменные в модель, поэтому мне нужно только каждый раз вызывать функцию model вместо того, чтобы помещать весь массив $ 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() функцию. Мне также интересно, почему функция home работает нормально, без ошибок.

Ответ №1:

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

 

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');
  }

}
  

Ответ №2:

Как вы сказали, 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);
    }
  

}

Комментарии:

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