DMP將數據與數據庫操作分離,使得開發人員只需要專注于數據的變化,而不需要去考慮數據如何與數據庫進行交互。**各功能包管理自己的邏輯層。**
logic類分為兩大塊:**敏捷方法**和**事件方法**。
**敏捷方法**,可用于controller或者其他logic類調用的public、protected方法。它們已經集成了常規的一些操作。很多時候常規操作并不能滿足我們的需求,畢竟是邏輯層,需要的就是對基本數據的加工處理。那么這個時候我們就需要用到logic類的另一塊內容了:事件方法。
**事件方法**,對于每一個敏捷方法,都包含有至少一個的事件方法。它們都是protected方法,使用方法是直接重載他們。事件方法的優勢在于,你不需要在意操作的過程,而將注意力集中額外的處理數據的變化上。比如在添加之前需要設置一些默認數據,那么只需要在get敏捷方法的事件方法onGetAfter($item)中,對$item進行設置即可:
```
protected function onAddBefore(&$item): bool
{
$item["enable"] = true;
}
```
> 邏輯層位置:應用目錄/logic/功能塊名/邏輯類
繼承基本類framework\core\driver\Logic,它是一個抽象類,需要實現以下方法:
* **modelClassPath(): ?array** 返回當前邏輯使用的model類路徑。敏捷方法都通過這個方法獲得model實例進行操作。
## 敏捷方法:
* **getStatement(): array** 邏輯申明,詳細內容請查看下一級內容《邏輯申明》。
* **getSearchOperationFilter(): array** 指定查詢操作符,**未指定的參數將無法篩選**,如果有外鍵關聯查詢,可通過.方式指定,比如:`"usertype.name"=>"="`,重載此方法,并返回一個數組。return一個鍵值對數組,字段名以及對應操作符。如:["title"=>"like"],如:
```
protected function getSearchOperationFilter()
{
return [
"name" => "like",
"description" => "like",
"parent_string" => "like%",
"id"=>function($paramName,$value){return ["id","in",[1,2,3]];}
//可以直接通過回調函數返回一個where數組或者字符串。
//id鍵值表示當查詢中包含id字段時將會觸發此條件。
];
}
```
* **getFailMessage()**
獲取失敗信息,獲取一次后該信息會失效。
* **protected function setFailMessage($message)**
設置失敗消息。當logic內部發生錯誤時,用此方法將失敗內容進行提示,此方法不影響返回結果,該return false的,還是要自己寫。
* **protected function fail($message)**
操作失敗的方法,當logic內部發生錯誤時,用此方法將失敗內容進行提示,與setFailMessage($message)不同的是,這個方法會返回fanlse,可以在操作過程中直接return此方法。
* **get($pk, $field = "*")**
獲取主體數據,返回的值為modelClassPath()方法指定的主體model返回記錄。$pk參數指的標識值,不一定就是表里面的id值。指定標識列在model里設置$pk='openid'。支持事件:onGetBefore($pk, $model),onGetAfter(?array &$item),支持申明內容,已集成消息隊列。
* **getRecord($pk, $field)**
獲取數據記錄請求的響應邏輯。這個方法可以用來返回數據庫的記錄數據。返回帶關聯數據等的情況建議通過get方法響應。支持事件:onGetRecordBefore($pk, $model),onGetRecordAfter($item),支持申明內容,集成消息隊列。
* **add($item)**
數據添加操作,返回值是新添加數據的標識序列,這個標識序列不一定是表里的id列。指定標識列在model里設置$pk='openid'。額外數據操作,在事件方法里設置。
* **addAll(array $items)**
批量添加信息,一次性批量提交信息。它有一個對應的addAllBefore與addAllAfter事件,并支持申明內容。
* **edit($pk, $item)**
數據修改操作,返回值是編輯之后的操作結果或者它的后置操作事件onEditAfter所返回的內容,$pk參數指的標識值,不一定就是表里面的id值。指定標識列在model里設置$pk='openid',在此過程中,如果提供的id值沒有對應的記錄,則會返回false,并有fail消息"未找到記錄"。額外數據操作,在事件方法里設置。
* **updateAll(array $pkAndValue)**
批量更新數據,根據鍵值對進行批量修改,數組的鍵為標識值。暫未支持事件,未支持申明內容,支持消息隊列。
* **setEnable($pk, bool $enable)**
修改數據表enable字段。提供標識值與true或否。指定標識列在model里設置$pk='openid'。額外數據操作,在事件方法里設置。支持事件:onSetEnableAfter($result),支持申明內容,已集成消息隊列。
* **setOrderNumber(array $pkAndValue)**
設置排序場景的響應邏輯,提供一個包含鍵為標識值,值為排序值的數組即可更新數據。支持事件:onSetOrderNumber(bool $result, array $requestItems),暫沒有支持的申明內容,已集成消息隊列。
* **delete($pk)**
刪除數據,提供標識值,批量刪除提供一個標識值的數組,返回刪除主鍵與onDeleteAfter返回值的和。指定標識列在model里設置$pk='openid'。額外數據操作,在事件方法里設置。支持事件:onDeleteBefore、onDeleteAfter,支持申明內容,已集成消息隊列。
**deleteBatch(array $where)**
根據指定條件批量刪除數據,暫未支持事件,未支持申明內容,支持消息隊列。
* **getList(int $currentPage, $searchKeyAndValue = [], $order = "", $pageSize = 0, $field = "")**
分頁、查詢、排序場景響應方法。返回為數組:["data":數據列表,"total":總記錄數],控制層的doGetList調用的就是這個方法。支持事件:onGetListBefore(array $searchKeyAndValue),onGetListAfter(array &$list),支持申請內容,已集成消息隊列。
* **protected function convertSearchParams($searchParams, $operationFilter = [])**
查詢轉換,將查詢鍵值數組轉化成TP查詢器數組,這個方法一般不需要自己調用。
* **protected function getModelInstance($modelName = ""): \Think\Model**
獲取一個關聯model實例的對象。惰性獲取。使用時不需要用變量保存,可以直接用。
## 事件方法:
* **protected function onGetListBefore(int $currentPage = 1, array $searchKeyAndValue = [], $order = "", $pageSize = 0, $field = "*")**
getList前置操作,提交數據庫查詢前的操作。
* **protected function onGetListAfter(array &$list)**
GetList后置事件方法。注意:不要在這里刪除數據,否則可能與翻頁不匹配。如果需要刪除數據,建議在前置事件中操作或者刪除完后再查詢一遍。
* **protected function onGetAllListBefore(array $searchKeyAndValue,$order = "", $field = "*")**
getAllList方法前置操作。提交數據庫之前拋出。
* **protected function onGetAllListAfter(array &$items)**
GetAllList后置事件方法。注意:不要在這里刪除數據,否則可能與翻頁不匹配。
* **protected function onAddBefore( $item):bool**
數據添加前置操作,$item:準備添加的數據內容,如果返回false,則添加會取消。對添加內容的預設值、強制對值設定可以放在這個方法里進行。比如:
```
protected function onAddBefore($item)
{
$item["enable"] = 1;
$item["create_info"] = json_encode(LoginState::getCreateInfo());
$parent = $this->get($item["parent_id"]);
$item["parent_string"] = $parent["parent_string"] . $parent["id"] . ",";
return $item;
}
```
* **protected function onAddAfter(bool $addResult, array $addItem)**
數據添加的后置操作,$addResult:添加結果,如果為false表示添加失敗。$addItem:添加成功的數據行,addResult為false,此項則為空數組。
* **protected function onAddAllBefore(array &$items):bool**
批量添加的前置操作,同onAddBefore,只是在用來響應addAll方法。$items:準備添加的數據數組,這里是一個引用參數,修改會直接更改添加內容。
* **protected function onAddAllAfter(array $successPks, array $addItems)**
批量添加后置事件方法。同onAddAfter,只是在用來響應addAll方法。$successPks:添加成功的主鍵值。$addItems:之前準備添加的數據行,不管結果成功或者失敗都返回。
* **protected function onEditBefore($pk, $original, $item):array**
數據修改前置操作,$pk:請求更新的數據標識。$original:當前數據庫的原始數據。$item:準備修改的數據。
* **protected function onEditAfter($original, $result)**
數據修改后置操作,$original:修改成功前的原始數據。$result:修改成功的數據行。
* **protected function onGetBefore($id, framework\core\driver\Model &$modelInstance)**
獲取數據的前置操作,$id:標識值,指定標識列在model里設置$pk='openid'。$modelInstance:查詢實例,可以在這里直接利用TP的鏈式操作做查詢的改變。model的with操作等可以在這里設置。
* **protected function onGetAfter(?array &$item)**
獲取數據的后置操作,$items:準備返回的數據。父類對create_info與update_info進行json_decode,子類中使用parent::onGetAfter來使用。
* **protected function onDeleteBefore($pk, framework\core\driver\Model $modelInstance):bool**
數據刪除的前置操作,$pk:標識值,指定標識列在model里設置$pk='openid'。$modelInstance:查詢實例。返回true表示繼續刪除。返回false則取消操作,并會在消息隊列中添加一個消息。
* **protected function onDeleteAfter($pk, array $deletedItems)**
刪除操作后置事件方法。可用來在這里做關聯刪除或者寫入日志等操作。,$pk:主鍵,提供數組表示批量刪除。$deletedItems:已刪除數據清單。二維數組。
* **protected function onGetRecordBefore($pk, framework\core\driver\Model &$model)**
get信息記錄前置操作。$pk:查詢標識。$model:model實例。
* **protected function onGetRecordAfter(?array &$item)**
get信息后置操作。$items:獲取到的原始記錄。
* **protected function onSetEnableAfter($result)**
SetEnable后置操作。$result:請求的setenable是否操作成功。
* **protected function onSetOrderNumber(bool $result, array $requestItems)**
setOrderNumber后置方法。$result 操作結果。true為成功,false為失敗。$requestItems 請求設置數據,僅包含有id和ordernumber值。
*****
另外設置有一個ApiLogic邏輯類,允許將這個邏輯類作為Api方式使用,某些模塊直接實例化將不受控制。
- 序言
- 基礎
- 開發規范
- 架構說明
- 總覽
- 中間件
- 事件
- 功能控制臺
- 場景事件驅動
- 異常提醒
- 應用功能接口(Api)
- 內置服務
- 框架服務
- 場景驅動控制器
- 事件驅動邏輯
- 邏輯申明
- 消息隊列
- 事件系統
- 鉤子掛件
- 賬戶管理服務
- 權限管理服務
- 日志服務
- 數據字典服務
- 功能控制服務
- 中后臺服務
- workdesktop
- 導航菜單
- 登錄態接入
- 歡迎頁
- 站內信
- 附件服務
- 托管
- 自定義上傳
- 設置標簽
- 文件檢索
- 資源公開
- 報表服務
- 報表易生成
- 報表導出
- 數據導入
- 信息回收服務
- 查詢手冊
- 路由
- 控制器
- 邏輯層
- 模型
- 模板
- 標簽庫
- 資源引用
- 配置
- 權限
- 菜單
- 功能包
- 前端框架
- api服務
- AccountService
- Authorization
- DataCrypt
- EventLog
- LoginState
- 工具類
- 更新日志