物件型介面 / 定製操作型別和欄位

天笑發表於2017-03-03

物件介面通過繼承AccessControl類來實現,預設允許5個標準物件操作,可以改寫屬性$allowedAc來限定允許的操作:

class AC_ApiLog extends AccessControl
{
    protected $allowedAc = ["get", "query"];
    // 預設值為 ["add", "get", "set", "del", "query"]
}

預設get/query操作返回ApiLog的所有欄位,可以用屬性$hiddenFields隱藏一些欄位,比如不返回"addr"和"tm"欄位:

class AC_ApiLog extends AccessControl
{
    protected $hiddenFields = ["addr", "tm"];
}

對於add/set介面,可用$requiredFields設定必填欄位,用$readonlyFields設定只讀欄位。 特別地,"id"欄位預設就是隻讀的,無須設定。

示例:實現下面控制邏輯

  • "addr"欄位為必填欄位,即在add介面中必須填值,在set介面中不允許置空;
  • "tm"欄位為只讀欄位,即在add/set介面中如果填值則忽略(但不報錯);
  • 在add操作中,由程式自動填寫"tm"欄位。

    class AC_ApiLog extends AccessControl { protected $requiredFields = ["addr"]; protected $readonlyFields = ["tm"];

    // 由add/set介面回撥,用於驗證欄位(Validate),或做自動補全(AutoComplete)工作。
    protected function onValidate()
    {
        if ($this->ac == "add") {
            $_POST["tm"] = date(FMT_DT);
        }
    }
    

    }

例中使用回撥onValidate來對tm欄位自動填值。 上面用到的常量FMT_DT是框架定義的標準日期格式,常用於格式化日期欄位傳到資料庫。

如果某些欄位是在新增時不是必填,但更新時不可置空,可以用$requiredFields2來設定; 類似地,新增時可寫,更新時只讀的欄位,用$readonlyFields2來設定。

相關文章