首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

CodeIgniter 核心類擴展實戰:MY_ 前綴配置、基礎控制器封裝與公共邏輯復用

     編輯:PHP 相關知識

打造專屬 CI 核心層:從配置到實戰的完整指南

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、導航、友鏈所有前台控制器
具體控制器業務邏輯單一模組

最佳實踐建議

  1. 工具函數放 Helper:字符串處理、日期格式化、陣列工具等純函數放 application/helpers/
  2. 避免過度繼承:超過 3 層繼承會增加認知負擔,必要時用 Trait 組合
  3. 庫 為主,核心類為輔:複雜業務邏輯(如 ACL、插件管理)封裝為 Library,核心類只負責調度
  4. 命名規範:_protected_method 內部方法,public_method 供子類/視圖調用

善用 CI 核心類擴展機制,能將數百行重複代碼壓縮為幾行繼承,讓控制器專注於業務邏輯本身。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved