跨系統資料以及API存取核心 data_api 套件
前言:
上一篇文章先列下了關於data_api的composer套件,這邊來記錄一下這個套件的開發緣由以及提供哪些功能
還記得更早之前的一個套件scopFilter,他的出現是為了在大部分的時間更簡單的寫query條件
沒想到因為這個filter可以再更近一步被使用,因為我們開發的每一套系統都已經安裝的scopFilter,所以我們可以透過定義一個介面來驅動scopeFiter
近一步做到跨系統的資料存取,這也是data_api發展的最主要原因
規格
首先來說說data_api的規格,我們定義了幾項入口
- fetch入口
- get入口
fetch作為讓所有有裝data_api的系統統一呼叫的入口,開發者不用想太多直接call fetch就對了,而get才是目標系統實際上去把資料取出的地方
分類
data_api可以取得哪些資料呢?
- 目標系統透過filter可以拿到的範圍都沒有問題
- 目標系統有開放出來的process api,帶入token以及參數可以正確取得
- 存取n8n上設計好的訊息通知流程
使用方法
- 後端透過定義好的crossService可以直接傳入特定Dto存取特定資料
- 後端透過定義好的crossFacade也可以少去new service的步驟傳入特定Dto存取特定資料
- 後端透過command line 也提供各方法可用參數查詢
特色說明
我們在CrossService中設計了一個固定流程
1 2 3 4 |
$this->_set_payload($payload) ->_fetch_system_host() ->_prepare_data_stream() ->_send(); |
也就每一個請求無論你要存取哪種資料都回經過這幾個步驟
- 儲存傳進來的payload
- 尋找目標系統URL
- 整理要送出的資料內容
- 實際將請求送出
這邊有幾點特別的可以說明,也就是上面提到的第三點跟第四點
這邊我們實作了兩個執行器,讓我來一一說明
第一個
1 2 3 4 5 6 |
protected function _prepare_data_stream(): static { $this->dataStreamService = $this->dataStreamManager->get($this->system_host,$this->payload); return $this; } |
dataStreamManager是第一個執行器,我們後透過傳進去給get的第二的參數判定這個參數的型態而動態生成所需要的Dto物件
1 2 |
public function get(string $system_host,PayloadContract $payload): DataStreamContract {} |
這個get function收的第二個三數只是要實作PayloadContract的class物件都可以,而return值則是實作了DataStreamContract的class物件都可以
這樣一來我們就可以透過實際上傳入的Payload物件來判斷需要生成的Stream物件該是哪個型態
另一方面也可以規範好要實作PayloadContract的所有Payload都需要有一個fecth的方法,下一個步驟會提到
第二個
1 2 3 4 |
protected function _send(): array { return $this->dataStreamService->fetch(); } |
第四個步驟send是實際把資料送出去的環節,因為每個需求所需要的目標都不同,因此這邊還是留了一個彈性
透過上一個步驟生成的dataStreamServer物件,統一都呼叫fetch方法,這樣就能夠讓不同類型的物件實際上透過不同邏輯來發出請求
很特別的東西
1.因應各系統開放出來的不同api文件需求,我們設計透過command來取得不同系統中process api的參數使用方式
首先,各系統要開出來的process api都需要在controller function上加入attribute,就像這樣子
1 2 3 4 |
#[ServiceAPI(name:'id_number',type: 'string',required: true,description: '統一編號')] #[ServiceAPI(name:'name',type: 'string',required: true,description: '公司名字')] public function company_verify(Request $request): bool {} |
透過command lined 可以查詢每個系統的process api所需參數
1 |
php artisan data-api:list |
2.因應n8n上串接的每個通知平台所需要的資料格式完全不同,即便是json也不好無腦寫出來,因此定義了一系列的Dto
透過這些Dto,我們可以輕鬆產出各平台所需要的json apyload
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
new CrossNotificationDto( system: 'n8n', token: 'LOGIN TOKEN', platform: Platform::Slack, payload: (new SlackBlocksPayloadDto( blocks:[ new SlackContextDto( elements: [ ] ) ] ))->get() )); |
這樣的payload內容就會是slack的block訊息