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

ThinkPHP 3.2.2 前後台共用基類架構最佳實踐

     編輯:PHP 相關知識

ThinkPHP 3.2.2 多模組共用基類 Controller 完整架構指南

ThinkPHP 3.2 引入命名空間機制,舊版 BaseAction 放在 Lib/Action 的做法不再適用。本文提供基於 Common/Controller/BaseController 的前後台共用基類架構,解決跨模組繼承與 A() 呼叫煩瑣問題。

目錄結構規劃

Application/
├── Common/
│   └── Controller/
│       └── BaseController.class.php  # 共用基類
├── Home/
│   └── Controller/
│       ├── BaseController.class.php  # 前台專用基類(可選)
│       └── NewsController.class.php
└── Admin/
    └── Controller/
        ├── BaseController.class.php  # 後台專用基類(可選)
        └── UserController.class.php

核心程式碼實作

1. 共用基類:Common/Controller/BaseController.class.php

<?php
namespace Common\Controller;

use Think\Controller;

/**
 * 前後台共用基類
 * @author Jack
 * @date 2014-07-12
 */
class BaseController extends Controller {
    
    public function _initialize() {
        // 全域初始化:語系、時區、權限檢查等
        $this->cfg();
        // dump('基類初始化'); // 除錯用
    }
    
    protected function cfg() {
        // 共用配置邏輯
        $this->assign('site_name', C('SITE_NAME'));
    }
}

2. 前台控制器繼承:Home/Controller/NewsController.class.php

<?php
namespace Home\Controller;

use Common\Controller\BaseController;

class NewsController extends BaseController {
    
    public function index() {
        $list = $this->getNewsList();
        $this->assign('list', $list);
        $this->display();
    }
    
    protected function getNewsList() {
        // 業務邏輯
        return M('News')->order('id DESC')->select();
    }
}

3. 進階:前台專用基類(可選)

<?php
// Home/Controller/BaseController.class.php
namespace Home\Controller;

use Common\Controller\BaseController as CommonBaseController;

class BaseController extends CommonBaseController {
    public function _initialize() {
        parent::_initialize();
        // 前台專用:SEO 設定、前台選單、使用者狀態等
        $this->assign('nav_active', 'home');
    }
}

// NewsController 改繼承 Home\Controller\BaseController
namespace Home\Controller;
use Home\Controller\BaseController;
class NewsController extends BaseController { ... }

關鍵技術要點

重點說明
命名空間宣告每個類別必須宣告 namespace,對應目錄結構
use 引入跨命名空間繼承需 use Common\Controller\BaseController
基類鏈Common → Home/Admin → 具體 Controller,避免重複造輪子
資源共用公共模型、函數、配置放在 Common,各模組直接使用

避免 A() 呼叫的優勢

  • 直接繼承共用基類,方法可用 $this->method() 呼叫
  • 屬性、模型、視圖自動共用,無需手動 import
  • 符合物件導向繼承原理,程式碼更清晰
  • 減少 A('Common/Controller') 字串硬編碼,重構更安全

常見問題排查

  • 類別找不到:檢查命名空間大小寫、目錄結構、檔案命名(.class.php)
  • _initialize 不執行:確認父類別有 public function _initialize() 且子類別未覆寫未呼叫 parent::_initialize()
  • 模板路徑錯誤:視圖目錄應對應模組,如 Home/View/News/index.html
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved