ThinkPHP 3.2 的應用模式機制,讓開發者能在不修改核心框架的前提下,靈活替換核心類別、配置載入順序、行為擴展掛鉤,輕鬆適應 SAE、CLI、REST 等不同執行環境。本文從原理到實戰,完整拆解模式擴展運作機制。
在入口檔定義常數 APP_MODE:
defined('APP_MODE') or define('APP_MODE', 'common'); // 預設普通模式
框架啟動時會自動識別 SAE 環境並切換至 sae 模式;CLI/CGI 環境亦會在預設模式中微調。
每個模式回傳一個陣列,包含四大區塊:
return array(
// 1. 配置檔載入順序
'config' => array(
THINK_PATH.'Conf/convention.php', // 系統慣例配置
CONF_PATH.'config.php', // 應用公共配置
),
// 2. 核心類別別名映射(用於自動載入)
'alias' => array(
'Think\Log' => CORE_PATH . 'Log'.EXT,
'Think\Model' => CORE_PATH . 'Model'.EXT,
// ...
),
// 3. 核心函數與類別檔案載入清單
'core' => array(
THINK_PATH.'Common/functions.php',
CORE_PATH . 'Hook'.EXT,
CORE_PATH . 'App'.EXT,
CORE_PATH . 'Dispatcher'.EXT,
// ...
),
// 4. 行為擴展掛鉤點
'tags' => array(
'app_init' => array('Behavior\BuildLiteBehavior'),
'app_begin' => array('Behavior\ReadHtmlCacheBehavior'),
'view_parse' => array('Behavior\ParseTemplateBehavior'),
// ...
),
);
// 載入模式定義檔
$mode = include is_file(CONF_PATH.'core.php')
? CONF_PATH.'core.php'
: MODE_PATH.APP_MODE.'.php';
// 1. 載入 core 列表檔案
foreach ($mode['core'] as $file) {
if (is_file($file)) { include $file; }
}
// 2. 載入 config 列表
foreach ($mode['config'] as $key => $file) {
is_numeric($key) ? C(include $file) : C($key, include $file);
}
// 3. 合併模式專屬配置
if ('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.'.php')) {
C(include CONF_PATH.'config_'.APP_MODE.'.php');
}
// 4. 註冊 alias 別名
if (isset($mode['alias'])) {
self::addMap(is_array($mode['alias']) ? $mode['alias'] : include $mode['alias']);
}
// 5. 匯入 tags 行為定義
if (isset($mode['tags'])) {
Hook::import(is_array($mode['tags']) ? $mode['tags'] : include $mode['tags']);
}
// 6. 載入語言包
L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');
ThinkPHP/Mode/lite.php,精簡 core 列表,移除不需的行為掛鉤ThinkPHP/Mode/Lite/ 目錄建立對應的核心類別(如 App.class.php、Dispatcher.class.php 等),命名空間必須為 Thinkdefine('APP_MODE', 'lite'); 即可啟用// ThinkPHP/Mode/Lite/App.class.php
namespace Think;
class App {
static public function init() { /* 初始化邏輯 */ }
static public function exec() { /* 執行應用 */ }
static public function run() { /* 入口快捷方法 */ }
static public function logo() { /* 顯示框架資訊 */ }
}
ThinkPHP 3.1 使用 MODE_NAME 常數切換模式,3.2 統一改為 APP_MODE,升級時請注意修正。
善用應用模式,可將框架核心行為「插件化」,針對不同部署環境、效能需求快速組裝專屬運行核心,是 ThinkPHP 3.2 架構彈性的關鍵所在。