[TOC]
#### 什么是上下文處理?
首先您先查看并了解了微擎的[消息響應流程](http://www.hmoore.net/donknap/we7/134650),明白消息的響應是通過“關鍵字”進行響應的。
比如,管理員設定好一系列的回復規則,當用戶輸入:“今天天氣是什么”,系統回復:“今天是晴天”。
此處的“今天天氣是什么”就是一個關鍵字,并且這個關鍵字是有意義的,管理員完全可以揣測出來用戶在輸入這句話期望得到的結果是“今天是晴天”。
所以管理員可以通過設置關鍵字回復來達到人機交互。
但是好些時候用戶輸入的關鍵字是需要通過上下文的理解來確定用戶的意圖。
比如,用微信打印照片,用戶先輸入:“打印照片”,系統回復:“請發送一張照片”,用戶發送一張照片,系統回復:“照片正在打印”。
如果沒有這樣的交互,用戶直接發送一張照片過來,系統無法得知用戶是要打印照片,還是要使用其它什么模塊功能。
所以微擎提供了上下文鎖定來處理此類需求
#### 上下文工作方式
* 上下文回復僅可以在 WeModuleProcessor 的繼承類中使用。
* 當管理設置一條規則觸發到該模塊的Processor中,可以過通$this->beginContext();來鎖定上下文會話。
* 鎖定會話后,后面無論用戶輸入什么內容,均會被直接觸發到該模塊的Processor中。
* 模塊進行一系列的交互與處理后,可以通過 this->endContext(); 來解鎖上下文會話。
* 用戶輸入的關鍵字繼續正常的被其它模塊接收。
#### 示例展示
下面的示例將演示根據血型查性格的簡單例子:
```
class BloodTestModuleProcessor extends WeModuleProcessor {
//void: 所有處理程序必須實現虛函數 respond. 用以響應消息
public function respond() {
if(!$this->inContext) {
$reply = '請輸入你的血型(A, B, O, AB), 來分析你今年的運程. ';
$this->beginContext();
// 如果是按照規則觸發到本模塊, 那么先輸出提示問題語句, 并啟動上下文來鎖定會話, 以保證下次回復依然執行到本模塊
} else {
$btypes = array('a', 'b', 'o', 'ab');
$b = strtolower($this->message['content']);
// 如果當前會話在上下文中, 那么表示當前回復是用戶回答提示問題的答案.
if(in_array($b, $btypes)) {
switch($b) {
case 'a':
$reply = 'A型血今年.....';
break;
case 'b':
$reply = 'B型血今年.....';
break;
case 'o':
$reply = 'O型血今年.....';
break;
case 'ab':
$reply = 'AB型血今年.....';
break;
}
$this->endContext();
// 如果當前回答符合答案格式, 那么進行保存并進行下一個問題. (可以保存至 SESSION 中)
// 直到最后一個問題回答完成, 輸出測試結果給用戶, 并結束對話鎖定. 以保證用戶其他對話能正常路由.
// 本示例只有一個問題, 因此不保存答案, 直接輸出測試結果.
// 如果對話默認的超時不夠, 那么可以在每次提出下一個問題的時候重新調用 beginContext 來順延超時.
} else {
$reply = '請輸入正確的血型(A, B, O, AB). ';
// 回答不符合答案格式, 那么重新顯示當前問題.
}
}
return $this->respText($reply);
}
}
```
#### 上下文實現原理
微擎的上下文操作使用 **$_SESSION + DB** 來實現.
上下文數據保存在 **$_SESSION['context']** 變量中,并與 __sessions__ 表中數據做一對一的映射,用戶可通過操作 sessions 表中的數據進行上下文會話的基本管理.
要實現上下文操作主要使用 **Processor** 里的內定方法:
* **public $inContext;**
本次對話是否為上下文響應對話, 如果當前對話是由上下文鎖定而路由到的. 此值為 **true**, 否則為 **false**
* **protected function beginContext($expire = 3600);**
請在模塊處理程序中調用此函數已開始一個新的上下文對話.
附加的參數 $expire 說明本次會話的失效時間.
例如 $this->beginContext(1800) 就說明啟動一次上下文會話鎖定, 并且本次會話將會于30分鐘后釋放, 如果不固定超時的話, 請在每次請求時調用 beginContext
* **protected function endContext();**
在模塊處理程序中調用 **endContext** 來**結束**一次會話, 并 **銷毀**會話中保存的所有數據(當前為 $_SESSION)
* **protected function refreshContext($expire = 0);**
**在模塊處理程序中調用 **refreshContext** 來刷新用戶處于上下文的時限. 超過時限用戶將會自動退出上文環境.
- 入門
- 系統安裝
- 接入公眾平臺
- 關鍵字回復
- 更上一層樓
- 編碼規范
- php編碼規范
- html&css編碼規范
- JavaScript編碼規范
- 系統概述
- 結構概述
- 入口腳本
- 微擎MVC
- URL路由&創建
- $_W&全局變量
- 加載器
- 錯誤處理
- 日志記錄
- 模板
- 模板標簽
- 數據調用
- 常用變量
- 手機端組件
- 概述及依賴
- 圖像上傳
- 彈出選項
- 后臺組件
- 概述及依賴
- 后臺文件上傳
- 富文本編輯器
- 系統鏈接選擇器
- 其它常用組件
- 數據庫
- 參數綁定
- 數據操作
- 主從配置
- 連接其它數據庫
- 緩存
- 配置
- 緩存操作
- Http請求
- 概述及依賴
- GET&POST請求
- 發送郵件
- 會員與積分
- 統一用戶中心
- 借用OAuth
- 積分操作
- 資料操作
- 卡券
- 營銷卡券
- 會員卡
- 消息響應
- 消息概述
- 消息響應
- 微信API
- 公眾號AccessToken
- 共享收貨地址(廢棄)
- 共享收貨地址(新)
- 粉絲標簽
- 客服消息
- 模板消息
- 粉絲信息
- 素材
- 群發
- 二維碼
- 在線支付
- 概述及依賴
- 發起支付(PHP)
- 發起支付(JS)
- 驗證支付
- 模塊
- 設計模塊
- 目錄結構
- module.php
- processor.php
- site.php
- receiver.php
- 模塊高級專題
- 自定義分享
- 智能應答
- 微信卡券
- 遠程附件
- 權限控制
- 特殊事件觸發模塊
- 粉絲信息
- 小程序
- 概述
- Uitl類
- 云服務
- 云API
- 系統接口
- 模塊云配置
- 云短信
- 云短信錯誤代碼
- 云短信發送函數
- 批量群發短信
- 應用推廣
- 懸賞文案
- 折扣碼
- 系統消息
- 開發者等級資料認證
- 應用標簽
- 模塊自動檢測訂閱支持
- 小程序
- 開發實例
- 參數設置
- 常見問題