在渲染之前重新安排对象上的 CakePHP JSON 响应

Posted

技术标签:

【中文标题】在渲染之前重新安排对象上的 CakePHP JSON 响应【英文标题】:Re-arrange a CakePHP JSON response on object prior to render 【发布时间】:2021-12-06 13:30:36 【问题描述】:

我正在开发基于 Cakephp REST/CRUD 的 API。它在/config/routes.php 中使用$routes->setExtensions(['json']); 将它的响应转换为json 对象。

我正在处理几个具有复杂架构的对象,我需要在提交到 CakeORM 之前对其进行预处理,以便为最终用户简化 API 集成。

例如,以下是需要使用$this->ImportSettings->patchEntity($importSetting, $requestData[2]) 修补到 ORM 的 json blob:

    
        "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 上的 ImportSesttings 事件侦听器,该侦听器能够判断索引“import_source_setting”是否属于“import_source_csv_headed_setting”、“import_source_csv_ordered_setting”或“import_source_google_setting”表,同样适用于资产和用户设置进入“import_destination_setting”。

这适用于在请求进入 ORM 之前处理请求中的重组数据。不过,我现在想在数据显示之前对数据做同样的事情,因此 API 用户不需要查看额外的源和目标设置。

我通过在系统另一部分的类似用例中使用中间件来实现这一点。然而,中间件似乎是附加到路由上的,我的使用似乎更像是应该与模型生命周期相关联的东西,因此只要返回导入设置并正确修改输出,它就会运行,即使是嵌套的也是如此。

鉴于我正在寻找的内容,我应该将这个重新组织 json 响应的逻辑放置在表的 ORM 查询结果中的哪个部分?你能指点我这方面的文件吗?

【问题讨论】:

【参考方案1】:

我在另一个论坛上使用CakePHP's calculated fields 找到了一个答案。看起来 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;
            );
        );
    

【讨论】:

以上是关于在渲染之前重新安排对象上的 CakePHP JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

Vue 改变数组中对象的属性不重新渲染View的解决方案

Cakephp 3:Json 渲染视图不起作用

在集合中的第二级更改后重新渲染 ng-options

关于确保用户收到他在 android 上安排的通知的问题?

重新安排用户通知(本地)?

echart重新渲染图表,遗留之前图表内容