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

CodeIgniter MY_Controller 基底控制器設計模式:多模組差異化載入與公用方法管理

     編輯:PHP 綜合知識

MY_Controller 角色

所有控制器繼承基底,集中:通用 Library/Helper 載入、權限檢查、模板佈局、錯誤處理、日誌記錄等橫切關注點。

核心問題:Public 方法會被 URL 直接存取

class MY_Controller extends CI_Controller {
    public function commonUtil() { ... } // 危險!可透過 /my_controller/commonutil 存取
}

解決:改用 protected 或 private,或移至 Library/Service。

多模組差異化載入策略

策略一:建構子參數判斷 (單一檔案)

class MY_Controller extends CI_Controller {
    public function __construct($module = 'frontend') {
        parent::__construct();
        switch ($module) {
            case 'admin':
                $this->load->library('admin_acl', null, 'acl');
                $this->load->helper('admin_ui');
                break;
            case 'api':
                $this->load->library('jwt_auth', null, 'auth');
                $this->output->set_content_type('application/json');
                break;
            default:
                $this->load->library('frontend_helper', null, 'helper');
                $this->load->library('theme');
        }
    }
}

// 子控制器
class Admin_Users extends MY_Controller {
    public function __construct() { parent::__construct('admin'); }
}

策略二:路由目錄自動判斷 (零參數)

class MY_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $dir = $this->router->directory; // e.g. 'admin/', 'api/'
        
        match (trim($dir, '/')) {
            'admin' => $this->load->library('acl', null, 'acl'),
            'api'   => $this->load->library('jwt', null, 'auth'),
            default => $this->load->library('theme'),
        };
    }
}

策略三:分離基底類別 (最清晰)

// core/Frontend_Controller.php
class Frontend_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->library('theme');
        $this->load->helper('frontend');
    }
}

// core/Admin_Controller.php
class Admin_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->library('acl');
        $this->load->model('admin/User_model');
    }
}

// 使用
class Home extends Frontend_Controller { ... }
class Admin_Users extends Admin_Controller { ... }

公用方法管理原則

  1. 視圖相關:render($view, $data)、setLayout() → 保留在基底控制器 protected
  2. 權限/驗證:requireLogin()、checkPermission() → 基底 protected 或 Service
  3. 資料處理:paginate()、exportCsv() → 移至 Library/Helper
  4. 業務邏輯:嚴禁 放在 Controller,必須在 Service

避坑指南

  • ❌ 基底控制器過度膨脹 → 拆分至 Library/Service/Helper
  • ❌ 子類別建構子忘記 parent::__construct()
  • ❌ 同名方法覆蓋導致基底邏輯失效 → 命名規範 _initAdmin()
  • ✅ 使用 get_instance() 在 Library/Helper 存取 CI 資源
  • ✅ 共用程式碼優先考慮 Composer 獨立類別,降低框架耦合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved