iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
0
Modern Web

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

Day#12 Api platform IRI 鎖鏈!? 咦,是酷拉皮卡的鎖鏈嗎?(๑´ڡ`๑)

IRI 到底是什麼東西 ?? 我們可以看作是某張表下的某筆資料的身分,也可以拿來當作主表與副表間的鎖鏈

由於這次的篇章裡都沒有提到 Doctrine ORM ,
所以針對關聯只做說明,不做操作,怕多講了Doctrine 可能會記憶體爆滿..


一般我們兩張表關聯,通常是用主表的id當成附表的關聯,
假設今天主表叫做Box ,副表叫做Pencil , jasonld在處理關聯時,不是用一般的id欄位 ,
而是用 iri (@id) ,用上述做舉例,我在Box看見的Pencil 關聯會長成 /api/pencil/{id}

我們可以在api platform 頁面上的response看見

如果我們將IRI拿來當作主表與副表的鎖鏈,就會有些限制 ,
api platform 會在deserialize,也就是將json格式轉成物件寫入的時候去驗證我們的IRI是不是有效的,
怎麼樣的IRI是無效的呢?

  1. 空字串 => " "
  2. 表不存在這個ID

假設今天我要更新一筆副表的資料,一定要提供副表自己的IRI,否則會被視為要刪除這筆副表的資料

又假設,我今天要判斷,我這張主表下一定要新增一筆副表的資料... 直接在關聯欄位上加上 NotBlank 嗎 ?

錯... 必須先把該欄位的nullable設定為true ,讓它可以為null ,
再加上notBlank判斷,而送出的request值要是null,才會達到驗證的效果 ,
為什麼是要先設定nullable才加上NotBlank呢?
因為validation的機制是在deserialize後執行的,如果沒有加nullable,它可是會森77報500給你看的哦!!

在假設我今天就是刻意要刪掉這筆副表資料,我只要在request的@id值給undefined就好了,
跟第一個假設大同小異,只是第一個假設是不小心刪掉資料而已...阿為什麼要分開講?
因為小菜鳥本人當初就是智商堪憂,不小心沒有送@id,造成資料誤刪的情形...
好險只是在開發的時候,測試機的資料沒有關係的~

這篇講了IRI的小觀念跟一個自己踩過的雷...
下一篇要來講Group這個東西,設定完群組,可以拿來用在validation跟http的那五種method上,
比如有些可以寫值,有些只能讀值...等等

主副表間的鎖鏈跟我心目中的鎖鏈不一樣R,我心中的大概是下面這樣吧...


上一篇
Day#11 Api Platform 裡的兩大設定,針對單筆資料及多筆,除了數量外,它們其實大不同R ( ゚∀゚)o彡゚
下一篇
Day#13 透過群組Group來進行讀或寫的權限區分
系列文
PHP框架-Symfony4 + api platform 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言