我正在研究基于 CakePHP REST/CRUD 的 API。它采用$routes->setExtensions(['json']);內/config/routes.php做出它的回應轉換成JSON物件。
我正在處理幾個具有復雜模式的物件,我需要在提交到 CakeORM 之前對其進行預處理,以簡化最終用戶的 API 集成。
例如,以下是需要使用以下命令修補到 ORM 的 json blob $this->ImportSettings->patchEntity($importSetting, $requestData[2]):
{
"id": 2,
"generic_setting": "Hello World",
"import_source_google_setting": null,
"import_source_csv_ordered_setting": null,
"import_source_csv_headed_setting": {
"id": 1,
"import_settings_id": 2,
"delimiterId": 1
},
"import_destination_user_setting": null,
"import_destination_asset_setting": {
"id": 2,
"import_settings_id": 2,
"defaultValueId": 1
}
}
在匯入設定上可以定義許多來源之一和許多指定設定之一。為了簡化 API 用戶,我允許他們提交以下內容:
{
"id": 2,
"generic_setting": "Hello World",
"import_source_setting": {
"id": 1,
"import_settings_id": 2,
"delimiterId": 1
},
"import_destination_setting": {
"id": 2,
"import_settings_id": 2,
"defaultValueId": 1
}
}
我已將代碼寫入beforeMarshal for ImportSesttings的事件偵聽器中,該偵聽器能夠判斷索引“import_source_setting”是否屬于表“import_source_csv_headed_setting”、“import_source_csv_ordered_setting”或“import_source_google_setting”,同樣資產和用戶設定進入“import_destination_setting” ”。
這適用于在請求進入 ORM 之前處理請求中的重組資料。但是,我現在想在資料顯示之前對資料做同樣的事情,因此 API 用戶不需要查看額外的源和目標設定。
我通過在系統另一部分的類似用例中使用中間件來實作這一點。然而,中間件似乎是附加到路由上的,我的使用似乎更像是應該與模型生命周期相關聯的東西,因此只要回傳匯入設定并正確修改輸出,即使嵌套時它也會運行。
鑒于我在尋找什么,我應該將這個重新組織 json 回應的邏輯放在 Cake 的哪個部分,以便在表的 ORM 查詢結果中重新組織?你能指點一下這方面的檔案嗎?
uj5u.com熱心網友回復:
我在另一個論壇中使用CakePHP 的計算欄位找到了一個答案。看起來 formatResults() 函式可以附加到帶有回呼的查詢,以在查詢運行后重新組織結果。我繼續將它附加到 beforeFind() 事件中的查詢,這似乎有效。
請參閱下面的示例:
<?php
class ImportSettingsListener implements Cake\Event\EventListenerInterface
{
public function implementedEvents(): array
{
return [
'Model.beforeFind' => 'generateQuery',
];
}
public function generateQuery(Event $event, Query $query, ArrayObject $options, bool $primary): void
{
$query->formatResults(function (CollectionInterface $results) {
return $results->map(function ($setting) {
// Re-format $setting here
return $setting;
});
});
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/336466.html
標籤:php 休息 蛋糕 cakephp-3.0 粗渣
