iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
Modern Web

PHP框架-Symfony4 + api platform 系列 第 14

Day#14 資料型態轉來轉去是在轉什麼啦(/‵Д′)/~ ╧╧!!!? Serializer

  • 分享至 

  • xImage
  •  

在講Serializer前,先附上一張源自於官方的圖


這邊分為六大動作及資料的三種型態,這張圖很明顯的可以告訴我們各個型態間是怎麼做資料轉換的

  • 資料型態

    1. Format ( JSON,XML) 資料交換的型態
    2. Array 陣列
    3. Object 物件
  • 動作

    1. Encode 編碼 : 將陣列編碼成json格式 在request前就執行完encode的動作了,所以我們在network的request header上看見的才是json格式 (因為瀏覽器不吃特定格式)
    2. Decode 解碼 : 將Json等資料型態轉解碼成陣列 ,在response回來前就執行完decode的動作了,所以我們在 network的response上看見的資料才是陣列的格式
    3. Denormalize 反規範化 : 將資料從陣列轉成物件型態給Doctrine閱讀,這動作可以簡化update,提升資料庫效能
    4. Normalize 正規化 : 將資料從物件轉成陣列,且Serialize裡面的normalize function傳入的第三個參數可以 指定要將哪個group的欄位從物件轉成陣列供我們讀取
    5. Deserialize 反序列化 : 將取得的json格式轉為物件
    6. Serialize 序列化 : 將物件轉為json格式

使用5和6時要注意實體類與json格式裡的資料要匹配,否則會報錯

這裡舉例一個小菜鳥本人因為見識淺薄所以踩過的雷...
那時候我將一個關聯欄位的nullable給false,我要讓那個關聯欄位是一定要有資料的,
我也給了Validator的NotBlank , 看起來一切都該很正常對吧?
沒有...結果它很生氣地報了500 error給我看, 因為它先去檢查nullable了...

一開始一直不懂為何,後來跑去問公司的前輩...前輩給了一個概念

validation驗證是在serialize後才執行

關聯欄位是看IRI ,
但IRI會自動幫我們驗證是不是無效,我如果給null的IRI,進到serialize的時候就會變成無效IRI,

但一般欄位不會有上述情形 ,所以後來小菜鳥我的解法是將關聯欄位nullabel設為true,再給not blank的驗證

還有一個問題有可能會碰到,就是欄位型態的問題,"0" 跟 0 ,
一個是字串,一個是數字,當我string型態的欄位接收到數字時,在serialize時就會型態錯誤,
有一個解決方法,就是在Api Resource 的denormalizationContext裡有個設定,
把它調成true,這樣在serialize時就不會驗證欄位型態了!

下一篇要來講Filter(過濾器),如何讓使用者透過前端送搜尋條件來讀取他們想要的結果,
例如...小菜鳥本人就是那種奧客...喝貢丸湯不吃貢丸,吃蚵仔煎不加蚵仔的那種..
每次跟老闆說,老闆都要幫我把貢丸跟蚵仔撈掉,也就是幫我過濾掉,這樣子使用者滿意,客戶也滿意,對吧~!?


上一篇
Day#13 透過群組Group來進行讀或寫的權限區分
下一篇
Day#15 老闆~貢丸湯不要貢丸,蚵仔煎不要蚵仔! - Filter
系列文
PHP框架-Symfony4 + api platform 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言