laravel5.5 apiResource 在项目中如何运用

laravel 利用 resource来做模型和返回数据的中间层处理,在运用的时候应该怎么使用呢?

  1. 看了文档的例子,介绍了一个model对应一个Resource,或者一个model对应一个ResourceCollection,假设我一个controller中写了多个接口,返回的数据格式都要求不一样该怎么处理
  2. 通过关联关系查找出来的数据,比如一个老师有2个班级,每个班级有5门课程
    关系如下
老师 
=== 班级一 
    ====课程一
    ====课程二
    ......
=== 班级二
    ====课程一
    ====课程二

返回的格式需要对老师的数据进行过滤,对班级、课程同样进行过滤,
返回的格式同上,或者老师、班级、课程三类同级,该如何是好?

文档上使用条件关联来处理,莫非我创建一个接口,需要写三个resource?那万一单独获取其中某一个班级或课程信息,返回的格式与之前写的resource不同的话怎么办,在创建一次?

clipboard.png

参考文档: https://d.laravel-china.org/d...

阅读 7.8k
1 个回答

这个问题本质是复杂api resource如何构建。
简单api resource直接通过Resource实现,复杂的需要通过ResourceCollection实现。
下面是个简单的示范例子。
<?php
class TeaController {

public function grade(Request $request)
    $collection = (new TeacherService())->getGrade($request->input('tea_id'));
    return new GradeCollection($collection);
}

}

class TeacherService
{

public function getGrade($tea_id) {
    // @todo: 根据tea_id获取对应结果集
    // Eloquent ORM返回的数据类型默认就是collect
    $collection = collect([3,4,5]);
    return $collection;
}

// @todo: 获取数据collection,可以通过ORM模型
public function getCourse($tea_id) {
    $collection = collect([]);
    return $collection;
}

}

class GradeCollection {

public function toArray($request)
{
    // @todo: 根据需要拼装自己的数组
    return [
        'data' => $this->collection,
    ];

}

}

上面的例子省略了重要的业务逻辑部分,因为每个业务模型的业务逻辑不尽相同。
但是基本说明了如何处理复杂ResourceCollection。
本质是构造和生成ResourceCollection.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题