实际上,在我自己对此进行了相当多的研究之后,我得出的结论是,在MVC中包含页眉和页脚的最佳实践是第三种选择 - 即扩展基本控制器。这将比文本的建议给你更多的灵活性,特别是如果你正在构建一个非常模块化的布局(不仅仅是页眉和页脚,还有侧边栏面板,非静态菜单等)。
首先,定义一个类,在该类中,您可以创建将页面元素(页眉、页脚等)追加到输出字符串的方法:Base_controller
class Base_controller extends Controller
{
var $_output = '';
function _standard_header($data=null)
{
if (empty($data))
$data = ...; // set default data for standard header here
$this->_output .= $this->load->view('header', $data, true);
}
function _admin_header($data=null)
{
if (empty($data))
$data = ...; // set default data for expanded header here
$this->_output .= $this->load->view('admin_header', $data, true);
}
function _standard_page($data)
{
$this->_standard_header();
$this->_output .=
$this->load->view('standard_content', $data, true);
echo $this->_output; // note: place the echo statement in a
// separate function for added flexibility
}
function _page_with_admin_header($data)
{
$this->_admin_header($data);
$this->_output .=
$this->load->view('standard_content', $data, true);
echo $this->_output;
}
}
然后,在页面控制器中,只需扩展基类并调用函数来生成页面。
class Page_controller extends Base_controller
{
function index()
{
$data = ...; // Set content data here
$this->_standard_page($data);
}
function admin()
{
$data = ...; // Set content and header data here
$this->_page_with_admin_header($data);
}
}
使用基本控制器,您可以在各个页面控制器中实现非常干净的代码,并为页面上的元素提供单独的视图(允许在视图和控制器中重用代码)。您需要做的就是将公共页面“部分”(您可能倾向于称之为“片段”)定义为基本控制器中的函数。
如果基本控制器开始不受控制地增长(这可能发生在大型站点上),您可以通过将它们放在子类中并让相应的页面控制器扩展这些功能而不是原始基础控制器来重新排列其一些不太通用的功能。
享受!