CodeIgniter(CI)允許通過 application/core/ 目錄擴展系統核心類,將認證檢查、權限控制、視圖載入、公共數據注入等通用邏輯下沉到基礎控制器,避免控制器代碼重複。本文詳細演示配置步驟與實戰模式。
編輯 application/config/config.php:
$config['subclass_prefix'] = 'MY_'; // 預設即為 MY_,可自定義
核心類文件命名規則:MY_Controller.php、MY_Model.php 等,放置於 application/core/。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
abstract class Admin_Controller extends CI_Controller {
public $_admin = NULL;
public function __construct() {
parent::__construct();
$this->load->library('session');
$this->settings->load('backend');
$this->load->switch_theme(setting('backend_theme'));
$this->_check_login(); // 統一登入檢查
$this->load->library('acl'); // 權限庫
$this->load->library('plugin_manager'); // 插件管理
}
// 登入檢查
protected function _check_login() {
if (!$this->session->userdata('uid')) {
redirect(setting('backend_access_point') . '/login');
}
$this->_admin = $this->user_mdl->get_full_user_by_username(
$this->session->userdata('uid'), 'uid'
);
if ($this->_admin->status != 1) {
$this->session->set_flashdata('error', '帳號已凍結');
redirect(setting('backend_access_point') . '/login');
}
}
// 統一視圖載入
protected function _template($template, $data = array()) {
$data['tpl'] = $template;
$this->load->view('sys_entry', $data);
}
// 權限檢查
protected function _check_permit($action = '', $folder = '') {
if (!$this->acl->permit($action, $folder)) {
$this->_message('無訪問權限', '', FALSE);
}
}
// 統一提示跳轉
public function _message($msg, $goto = '', $auto = TRUE, $fix = '') {
if ($goto == '') $goto = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : site_url();
else $goto = strpos($goto, 'http') !== false ? $goto : backend_url($goto);
$goto .= $fix;
$this->_template('sys_message', compact('msg', 'goto', 'auto'));
echo $this->output->get_output(); exit();
}
}
?>
<?php
abstract class Front_Controller extends CI_Controller {
public function __construct() {
parent::__construct();
}
// 前台視圖載入(注入導航、友鏈等公共數據)
public function _template($template, $data = array()) {
$data['nav'] = $this->get_nav();
$data['tpl'] = $template;
$this->load->view('default', $data);
}
public function get_nav() { /* 導航邏輯 */ }
public function get_friendlink() { /* 友鏈邏輯 */ }
}
?>
class News extends Front_Controller {
public function index() {
$this->_template('news_list', ['news' => $this->news_mdl->get_list()]);
}
}
class Admin_News extends Admin_Controller {
public function index() {
$this->_check_permit('news', 'view');
$this->_template('admin/news_list', ['news' => $this->news_mdl->get_all()]);
}
}
| 層級 | 職責 | 復用範圍 |
|---|---|---|
CI_Controller | 框架核心 | 全項目 |
MY_Controller (可選) | 全站通用:CSRF、語言、日誌 | 全站 |
Admin_Controller | 後台:登入、權限、主題、後台佈局 | 所有後台控制器 |
Front_Controller | 前台:佈局、SEO、導航、友鏈 | 所有前台控制器 |
| 具體控制器 | 業務邏輯 | 單一模組 |
application/helpers/_protected_method 內部方法,public_method 供子類/視圖調用善用 CI 核心類擴展機制,能將數百行重複代碼壓縮為幾行繼承,讓控制器專注於業務邏輯本身。