ThinkPHP 是國產經典 MVC 框架,3.2 版本引入命名空間、Composer、模塊化架構。本文記錄安裝入口配置、自動生成目錄結構、URL 訪問規則、控制器/視圖對應關係、常見坑點。
# 推薦 Composer 安裝 (ThinkPHP 6.0+)
composer create-project topthink/think tp6
# 3.2 版本手動安裝:下載框架核心,建立入口文件
# 目錄結構:
# /wwwroot
# ├─ ThinkPHP/ 框架核心
# ├─ admin.php 後台入口
# ├─ index.php 前台入口
入口文件 admin.php:
<?php
// 定義應用名稱與路徑
define('APP_NAME', ''); // 空則不加前綴
define('APP_PATH', './admin/'); // 應用目錄 (相對入口文件)
define('APP_DEBUG', true); // 開發模式:關閉緩存、顯示錯誤
// 載入框架引導文件
require __DIR__ . '/ThinkPHP/ThinkPHP.php';
?>
admin/ (APP_PATH)
├─ Common/ 公共函數、配置
│ ├─ common.php 公共函數庫
│ ├─ config.php 應用配置 (資料庫、快取等)
│ └─ function.php 助手函數
├─ Conf/ 配置文件 (3.2 常用)
│ └─ config.php
├─ Lang/ 語言包
│ └─ zh-cn.php
├─ Lib/ 核心業務代碼 (MVC)
│ ├─ Action/ 控制器 (3.2 稱為 Action)
│ │ └─ IndexAction.class.php
│ ├─ Model/ 模型
│ │ └─ UserModel.class.php
│ └─ ... 可擴展 Validate, Service 等
├─ Runtime/ 運行時緩存、日誌、編譯模板
│ ├─ Cache/
│ ├─ Logs/
│ ├─ Temp/
│ └─ Data/
└─ Tpl/ 模板視圖
└─ Index/ 對應控制器名
└─ index.html 對應操作方法名
| 模式 | URL 格式 | 對應控制器/方法 | 說明 |
|---|---|---|---|
| 普通 (PATH_INFO) | admin.php?m=User&a=login | UserAction::login() | GET 參數 m=模塊/控制器, a=操作/方法 |
| PATH_INFO (推薦) | admin.php/User/login | UserAction::login() | 需 Web 服務器配置 rewrite |
| REWRITE (隱藏入口) | /admin/User/login | UserAction::login() | Nginx/Apache rewrite 規則隱藏 admin.php |
| 兼容模式 | admin.php?s=/User/login | UserAction::login() | 不支援 PATH_INFO 環境 |
關鍵規則:
Action 後綴:UserAction,對應 URL m=User 或 /User/login(),對應 URL a=login 或 /loginTpl/控制器名(無Action)/操作名.html → Tpl/User/login.html$this->display('template') 可指定其他模板,不加參數則自動對應當前操作<?php
// Lib/Action/UserAction.class.php
namespace Home\Action; // 3.2.3+ 需命名空間
use Think\Action;
class UserAction extends Action {
// 登入頁面
public function login() {
if (IS_POST) {
$username = I('post.username');
$password = I('post.password');
// 驗證邏輯...
$this->success('登入成功', U('Index/index'));
} else {
$this->display(); // 自動載入 Tpl/User/login.html
}
}
// 註冊
public function register() {
$this->display('register'); // 載入 Tpl/User/register.html
}
// 受保護方法:前綴 _ 不會被 URL 直接訪問
protected function _checkAuth() {
// 權限檢查
}
}
?>
{-- Tpl/User/login.html --}
用戶登入
{-- 輸出模板變量 --}
{$vo.name} - {$vo.email}
<?php
return [
// 資料庫配置
'DB_TYPE' => 'mysql',
'DB_HOST' => '127.0.0.1',
'DB_NAME' => 'thinkphp',
'DB_USER' => 'root',
'DB_PWD' => 'password',
'DB_PORT' => 3306,
'DB_PREFIX' => 'tp_',
'DB_CHARSET'=> 'utf8',
// URL 模式
'URL_MODEL' => 2, // 2=PATH_INFO, 3=REWRITE, 1=普通, 0=兼容
// 模板引擎
'TMPL_ENGINE_TYPE' => 'Think',
'TMPL_CACHE_ON' => !APP_DEBUG,
'TMPL_L_DELIM' => '{',
'TMPL_R_DELIM' => '}',
// 預設模塊/控制器/操作
'DEFAULT_MODULE' => 'Index',
'DEFAULT_CONTROLLER' => 'Index',
'DEFAULT_ACTION' => 'index',
];
?>
server {
listen 80;
server_name tp.example.com;
root /wwwroot; # 入口文件所在目錄
index index.php admin.php;
location / {
# 嘗試直接訪問文件/目錄,否則轉發到 index.php
try_files $uri $uri/ /index.php?s=$uri&$args;
}
# 後台入口單獨處理
location /admin {
try_files $uri $uri/ /admin.php?s=$uri&$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止訪問 Runtime、Conf 等敏感目錄
location ~ /(Runtime|Conf|Lib)/ {
deny all;
}
}
| 問題 | 原因 | 解決 |
|---|---|---|
| 控制器找不到 (404) | 類名首字母未大寫、或缺少 Action 後綴 | 類名必須如 UserAction,URL 用 User |
| 模板找不到 | 目錄結構不對、或大小寫不匹配 | 模板路徑:Tpl/控制器名/操作名.html,Linux 區分大小寫 |
| URL 參數獲取不到 | 用 $_GET 而非 I() | 統一用 I('get.id'), I('post.name'), I('id') |
| 驗證碼不顯示 | GD 擴展未裝、或 Session 路徑不可寫 | 安裝 php-gd、檢查 session.save_path 權限 |
| 分組/模塊不生效 | 3.2 版本模塊配置變更 | 查閱對應版本文檔,配置 MODULE_ALLOW_LIST |
ThinkPHP 3.2 核心概念:
index.php/admin.php 分發m=模塊&a=操作 → 模塊Action::操作()新專案建議直接使用 ThinkPHP 6.0/8.0 (Composer 安裝、PSR-4、PHP 8.1+ 支援),3.2 僅維護老專案。