开发api时遇到的问题

我开发一个api,使用的是 dingo/api 这个库,比如news,会有 api/news 和 api/news/1 这种。要返回字段并不一样,比如 api/news 不会返回content,评论等。写 transform 的时候就没办法区分列表或者是单一的新闻。我现在的办法是分成两个转换类 NewsListTransformerNewsTransformer 来使用。不知道还有没有更好的办法。

另外还有一个问题是,新闻是有评论的,读取单个新闻的时候,会一起读出来3条新闻评论。这个评论也是需要转换的,单条的可以通过 (new CommentsTransformer)->transform($item) 来转换,多条的这个办法就行不通了。

perfectboook

暂时算是解决了,写一下解决的办法。谁有更好的办法可以和我说下。

第一个问题是区分为两个transformer,不多说,第二个关联多个评论的解决代码为:

NewsTransformer.php

public function transform($item)
{
    return [
        'id' => $item->id,
        'title' => $item->title,
        'created_at' => $item->created_at . '',
        'content' => $item->content,
        'comments' => $this->transformComments($item->comments()->take(3)->get()),
        'comments_count' => $item->comments->count(),
    ];
}

public function transformComments($comments)
{
    //这里不可以使用array_map,转换为数组后会导致NewsCommentsTransformer里面获取错误。
    $array = [];
    foreach ($comments as $news_comments){
        $array[count($array)] = (new NewsCommentsTransformer)->transform($news_comments);
    }
    return $array;
}

NewsCommentsTransformer.php

public function transform($item)
{
    return [
        'id' => $item->id,
        'content' => $item->content,
        'userid' => $item->user_id,
        'username' => $item->user->name,
        'created_at' => $item->created_at . ''
    ];
}
JellyBool

之前在群里讨论过一次,貌似也是这样的,好像也没有更好的解决方案,有一种是将不需要的字段直接设置为空。

perfectboook

@JellyBool 恩,不需要的字段设置空会有很多多余的空字段。而且不光是字段,还有些关联表数据。暂时就先这样了,理解起来也不算麻烦。

sodasix

其实…我是觉得, 可以在查询的时候, 就避免查询出多余的字段啊…

perfectboook

@sodasix 恩,这个不是主要问题,主要是列表和详细的返回字段不一致,没有办法使用同一个transformer。还有就是关联到其他表的情况。

sodasix

@perfectboook 其实我嚼得吧, 本来就是不应该使用同一个 transformer 的

perfectboook

@sodasix 恩恩,就是有时就一个新闻,就需要好几种返回的方式,就得写好几个transformer

snail

建议使用同一个transformer,列表不返回具体内容字段呗

perfectboook

@snail 这样的话,光新闻就能返回两三种格式的,同一个transformer的话要加一些条件判断。而且还有的会带各种关联的字段,也会为很多其余的transformer来处理关联的字段。