ThinkPHP 的 `create()` 方法整合了資料物件映射、自動驗證、自動填充、自動完成(三大自動)與 **令牌驗證**,是表單處理的核心安全機制。本文透過實例說明運作流程與模板配合要點。
class IndexAction extends Action {
public function add() {
$user = M('User'); // 實例化模型
if ($data = $user->create()) {
// 驗證通過、令牌有效、自動填充完成
// $data 包含處理後的資料陣列
// 可直接 $user->add($data) 寫入資料庫
$this->success('資料建立成功', '__URL__/index');
} else {
// 驗證失敗或令牌錯誤
$this->error($user->getError());
}
}
}
<form action="__URL__/add" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<!-- 必須包含令牌隱藏欄位,框架自動生成 -->
<input type="hidden" name="__hash__" value="{$Think.__hash__}" />
<input type="submit" value="提交" />
</form>
⚠️ 若模板缺少 `__hash__` 欄位,`create()` 會直接返回 `false`,錯誤訊息通常為「表單令牌錯誤」。
| 現象 | 原因 | 解決 |
|---|---|---|
| create() 一直回傳 false | 模板缺少 __hash__ 欄位 | 加入 <input type="hidden" name="__hash__" value="{$Think.__hash__}" /> |
| AJAX 提交令牌失效 | Session 未共用或令牌未更新 | 回傳新令牌給前端,或關閉 AJAX 動作驗證 |
| 重複提交未攔截 | TOKEN_RESET 未開啟 | 配置 'TOKEN_RESET' => true 或模型 $token = ['reset' => true] |