介面返回前回撥

天笑發表於2017-03-14

介面返回前回撥

示例:新增訂單到Ordr表時,自動新增一條"建立訂單"日誌到OrderLog表,可以這樣實現:

class AC1_Ordr extends AccessControl
{
    protected function onValidate()
    {
        if ($this->ac == "add") {
            ... 

            $this->onAfterActions[] = function () {
                $orderId = $this->id;
                $sql = sprintf("INSERT INTO OrderLog (orderId, action, tm) VALUES ({$orderId},'CR','%s')", date('c'));
                execOne($sql);
            };
        }
    }
}

屬性$this->onAfterActions是一個回撥函式陣列,在操作結束時被回撥。 屬性$this->id可用於取add操作結束時的新物件id,或get/set/del操作的id引數。

物件介面呼叫完後,還會回撥onAfter函式,也可以在這個回撥裡面操作。 此外,如要在get/query介面返回前修改返回資料,用onHandleRow回撥函式更加方便。

示例:實現介面

Ordr.get(id) -> {id, status, ..., statusStr?}
Ordr.query() -> tbl(同get介面欄位...)

- status: "CR" - 新建立, "PA" - 已付款
- statusStr: 狀態名稱,用中文表示,當有status返回時則同時返回該欄位


class AC1_Ordr extends AccessControl
{
    static $statusStr = ["CR" => "未付款", "PA" => "待服務"];
    // get/query介面會回撥
     protected function onHandleRow(&$rowData)
     {
        if (isset($rowData["status"])) {
            $st = $rowData["status"];
            $rowData["statusStr"] = @self::$statusStr[$st] ?: $st;
        }
     }
}

相關文章