地图上的重置值/转换函数失败 - Laravel

Reset value on map / transform fucntion failed - Laravel

当我尝试将 id 的值更改为 encrypted Id 正在使用映射函数和转换函数时,它得到零值 no字符串值或字母数字被替换。

但是 API

的所有 ID 都必须加密

请帮助我。

函数

 function getLatestArticle($profileId)
 {
   $data = Article::wherehas('articleTrans',function($query){
    $query->where('status', ApiConstants::PUBLISHED_STATUS);
   })->with(['articleTrans'=>function($q){
        $q->select('id','article_id','language_id','title','short_description','description','main_image');
        $q->where('status', ApiConstants::PUBLISHED_STATUS);
   }])->latest()->paginate(ApiConstants::D_PAGE_C);

   $data->getCollection()->transform(function ($value) {
    $value->id = encrypt($value->id);
    return $value;
   });
    return $data;
  }

Collection

  "latest_data": [
        {
            "id": 0,
            "profile_id": 3,
            "name": "Test",
            "trending": 0,
            "new_arrived": 0,
            "featured": 0,
            "reading_time": null,
            "has_series": 0,
            "status": 0,
            "created_by": 1,
            "updated_by": 1,
            "deleted_at": null,
            "created_at": "2022-03-24T10:27:16.000000Z",
            "updated_at": "2022-03-31T11:41:14.000000Z",
            "created_from": 1,
            "article_trans": {
                "id": 8,
                "article_id": 12,
                "language_id": 1,
                "title": "Test",
                "short_description": "Test",
                "description": "<p><strong>TestTestTestTestTestTestTest&nbsp;</strong></p>\r\n\r\n<p><strong>TestTestTestTestTestTestTestTestTestTestTestTestTest</strong></p>",
                "main_image": "1648117636_AXwwVY6JSmNTxmXIiRqGlXiePTl70chCkmMDlehp.jpeg",
                "image_url": "http://127.0.0.1:8000/storage/admin/article/image/1648117636_AXwwVY6JSmNTxmXIiRqGlXiePTl70chCkmMDlehp.jpeg"
            }
        }

临时修改实体对象只是为了改变API响应格式不是很好的解决方案。

更好的解决方案 使用DTO/Transformer 类。变压器实施的好例子是https://fractal.thephpleague.com/transformers/

通过这种方式,您可以拆分演示文稿和模型。

使用任何包都是可选的,你可以像这样编写简单的转换器类:

// app/Transformers/ArticleTransformer.php
final class ArticleTransformer
{
    public static function transform(Article $article): array
    {
        return [
            'id' => encrypt($article->id),
            // any fields
        ];

        /*
           // or if you need change only one property
           return array_replace(
              $article->toArray(), // or $article->jsonSerialize()
              [
                  'id' => encrypt($article->id),
              ],
           ); 
        */
    }

    public static function transformCollection(Collection $articles): Collection
    {
        return $collection->map(fn (Article $article): array => self::transform($article));
    }
}

然后使用这个转换器:

return [
  'latest_data' => ArticleTransformer::transformCollection($latestArticles),
];

不是很好,但应该可以:

覆盖模型的jsonSerialize/toArray方法,在返回时修改你的id。