Cast 是什麼
Eloquent 的 cast 是將從資料庫取得的原始值轉換為 PHP 資料型別,儲存時再進行反向轉換的機制。透過casts 方法定義。
內建 Cast 種類
Laravel 標準提供的 cast 列表如下。AsArrayObject 與 AsCollection 為了讓陣列的特定 offset 可以直接被修改,於 Laravel 內部作為自訂 cast 實作。建立自訂 Cast 類別
若內建 cast 無法對應所需轉換,可建立實作CastsAttributes 介面的自訂 cast。
介面的定義
框架本體的 contract 定義如下。$attributes 引數含有模型的所有屬性,因此也能進行跨多欄位的轉換(後述 Value Object 模式)。
基本自訂 Cast 的實作
以make:cast 指令產生範本。
app/Casts/AsMoney.php。以將金額(以整數儲存)轉換為 Money Value Object 的 cast 為例。
$order->price 便會回傳 Money 實例。
Value Object Cast
將多個 DB 欄位彙整為一個 Value Object 處理的模式。實作範例:地址 Cast
將address_line_one 與 address_line_two 兩個欄位彙整為 Address Value Object。
當
set 方法回傳陣列時,Eloquent 會將 key 視為欄位名,將值分別存入各欄位。單一欄位的 cast 則會回傳字串或整數。Value Object 的快取
轉換為 Value Object 的屬性值會被 Eloquent 快取。即便對同一屬性存取兩次,也會回傳同一物件實例。 若想停用快取,可在 cast 類別上加入$withoutObjectCaching 屬性。
Inbound Cast(僅寫入時)
僅於寫入 DB 時進行轉換,讀取時不轉換的 cast。實作CastsInboundAttributes 介面。
典型用途為 hash 化。僅在儲存密碼或秘密值時進行轉換,讀取時直接回傳 hash 值。
Cast 參數
若要傳遞參數給自訂 cast,可在類別名稱後以冒號分隔指定。多個參數以逗號分隔。Castables:於 Value Object 端持有 cast 邏輯
實作Castable 介面的 Value Object 擁有回傳自身 cast 類別的 castUsing 方法。模型端無需知道 cast 類別,網域邏輯得以整理。
與 $appends、$hidden 的交互作用
Cast 與 $appends、$hidden 是各自獨立的機制,但組合時需注意。
執行時新增 Cast
若想僅為特定查詢或請求新增 cast,可使用mergeCasts 方法。
下一步
Eloquent Observer 與模型事件
學習掛勾模型的儲存、刪除等生命週期事件以新增處理的方法。