Laravel5设计json api时候的一些道道

简介:

对于返回数据格式没规整的问题

在开发api的时候,这个问题是和客户端交涉最多的问题,比如一个user结构,返回的字段原本是个user_name的,它应该是string类型。但是呢,由于数据库设计这个字段的时候允许为null,那么这个字段获取回来,就可能返回null,这个对于弱类型语言是没什么问题的,但是对于强类型的语言,可能就要增加字符的类型判断了。

或者是数据库中的text字段,里面存放的是json数据,现在取出来的时候我要做一些转换等。

所以对这个问题,我们会想到做一个类的格式方法。这个方法自然就是写在model中,在laravel5中,我使用这种方法:

model中:

class Inbox extends Model {

    protected $table = 'inbox';

    public static function format()
    {
        return function($item) {
            $tmp = $item->toArray();
            unset($tmp['deleted_at']);
            $tmp['sort'] = $tmp['id'];
            $tmp['uid'] = $tmp['sender'];
            $content = json_decode($item->content, true);
            $tmp['content'] = json_decode($content['content'], true);

            return $tmp;
        };
    }

    public static function formatRaw()
    {
        return function($item) {
            $tmp = $item->toArray();
            unset($tmp['deleted_at']);
            $tmp['sort'] = $tmp['id'];
            $tmp['uid'] = $tmp['sender'];

            return $tmp;
        };
    }
}

这里的Inbox设计了两种返回格式,每种返回格式都是返回的闭包函数,然后在controller中

$builder = Inbox::where('receiver', $uid)->where('sender', 0);

if ($max) {
    $builder->where('id', '<', $max);
}
$inboxs = $builder->orderBy('id', 'desc')->get();
$data = $inboxs->transform(Inbox::formatRaw());

好了,这样返回的$data就是进行结构化好的数据了。

这里主要想说laravel的Collection中的transfrom函数太好用了,参数是一个闭包,然后这个闭包封装在model中,好处是一旦客户端想要修改或者更新某个输出字段,我们就可以只要修改format函数就行。

对于返回外带外键的问题

比如上面一个例子中,往往inbox有个uid,接口需要它返回user的信息。那么这个时候,model的foreign key就起到很好的作用

class Inbox extends Model {

    protected $table = 'inbox';

    public function user()
    {
        return $this->hasOne('User', 'id', 'uid');
    }

    public static function format()
    {
        return function($item) {
            $user = $item->user;
            $tmp = $item->toArray();
            unset($tmp['deleted_at']);
            $tmp['sort'] = $tmp['id'];
            $tmp['uid'] = $tmp['sender'];
            $content = json_decode($item->content, true);
            $tmp['content'] = json_decode($content['content'], true);
            $tmp['user'] = $user;
            return $tmp;
        };
    }
}

但是这里切记别让每个数据循环获取user,我们应该显示地使用load或者with:

$builder = Inbox::where('receiver', $uid)->where('sender', 0);

if ($max) {
    $builder->where('id', '<', $max);
}
$inboxs = $builder->orderBy('id', 'desc')->get();
$inboxs->load('user');
$data = $inboxs->transform(Inbox::formatRaw());

总结

基本将这样两个问题解决,设计好orm,使用laravel来写接口就很快了。


本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/4423931.html,如需转载请自行联系原作者


相关文章
|
3月前
|
JSON 关系型数据库 MySQL
这个问题是由于Flink的Table API在处理MySQL数据时,将MULTISET类型的字段转换为了JSON格式
【1月更文挑战第17天】【1月更文挑战第84篇】这个问题是由于Flink的Table API在处理MySQL数据时,将MULTISET类型的字段转换为了JSON格式
34 1
|
3月前
|
JSON Java API
Spring Boot 无侵入式 实现API接口统一JSON格式返回
Spring Boot 无侵入式 实现API接口统一JSON格式返回
|
4月前
|
小程序 API 定位技术
【uni-app报错】选择地址:fail the api need to be declared in the requiredPrivateInfos field in app/ext.json
【uni-app报错】选择地址:fail the api need to be declared in the requiredPrivateInfos field in app/ext.json
111 0
|
4月前
|
XML JSON API
Json实现根据关键词搜索请求唯品会商品列表数据方法,唯品会商品列表数据接口,唯品会API接口申请指南,支持全站
Json实现根据关键词搜索请求唯品会商品列表数据方法,唯品会商品列表数据接口,唯品会API接口申请指南,支持全站
114 1
|
4月前
|
JSON API 数据格式
Json实现根据关键词搜索请求1688商品列表数据方法,1688商品列表数据接口,1688API接口申请指南
Json实现根据关键词搜索请求1688商品列表数据方法,1688商品列表数据接口,1688API接口申请指南
117 0
|
4月前
|
JSON 开发框架 .NET
ASP.NET Core Web API设置响应输出的Json数据格式的两种方式
ASP.NET Core Web API设置响应输出的Json数据格式的两种方式
|
6月前
|
XML JSON 缓存
Json实现根据关键词搜索请求京东商品列表数据方法,京东商品列表数据接口,京东API接口申请指南
Json实现根据关键词搜索请求京东商品列表数据方法,京东商品列表数据接口,京东API接口申请指南
50 0
|
6月前
|
XML JSON 缓存
Json实现根据关键词搜索请求淘宝商品列表数据方法,淘宝商品列表数据接口,淘宝API接口申请指南
Json实现根据关键词搜索请求淘宝商品列表数据方法,淘宝商品列表数据接口,淘宝API接口申请指南
221 0
|
6月前
|
XML JSON 缓存
Json淘宝商品详情数据接口,淘宝商品详情API接口,淘宝API接口介绍
Json淘宝商品详情数据接口,淘宝商品详情API接口,淘宝API接口介绍
23 0
|
7月前
|
JSON 物联网 API
嵌入式物联网开发之使用Json获取北京时间校准接口API
嵌入式物联网开发之使用Json获取北京时间校准接口API
263 1