我在控制器中有以下代码:
<?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);
}
}
?>
这在某种程度上适用于我的主页。它解析变量,没有任何问题。但是,在“计划者”页面上,我收到错误:
消息:缺少Student :: planner()的参数1
消息:未定义的变量:数据
消息:为foreach()提供的参数无效
我很确定我会收到这些错误,因为函数不知何故没有收到$data
数组。我还在CI文档中读到URL中的第三个段作为参数传递,在这种情况下,第三个段不存在,因此不会传递任何内容。但是,CI文档没有告诉我如何将$data
数组从index()
函数传递到我的planner()
函数。我也想知道为什么 home函数工作正常,没有错误。
答案 0 :(得分:3)
现在,我没有看到重构的原因,如果它会让代码真的很难看。我不完全确定解析函数的作用,所以我改变它的方式是将参数实际作为字符串传递,但最好是将内容加载到缓冲区并以这种方式传递。但这里有一些更清晰,更有希望可读的重复复制......并希望它有效:)。
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');
}
}
答案 1 :(得分: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);
}
}