什么是Fractal
Fractal为复杂的数据输出提供了样式和转化层。
通常做API 的时候都是从数据库拿出数据,然后转成json给客户端,对于不重要的api,可以这么做,但是如果是给公共的,或者是手机程序,就会出现多余的数据或者格式不一样的数据输出。
目标
- 在原始数据和输出数据中间搞一个墙('barrier'), 这样的话即使内部结构改变了也不会影响到用户.
- 有条理的数据格式转化
- 包含了数据的嵌套依赖
- 采用标准的HAL和JSON-API格式,并且允许自定义的连载
- 支持数据分页
- 将复杂的数据巧妙的输出给正规的API
一个简单的例子
这个列子是把下面的东西放在一起,现实开发中,我们会将Manage初始化,数据集合,json转化分开放到项目中.
class UsersController extends BaseController
{
public function index()
{
$fractal = new FractalManager();
$books = [
[
'id' => '1',
'title' => 'Hogfather',
'yr' => '1998',
'author_name' => 'Philip K Dick',
'author_email' => '[email protected]',
],
[
'id' => '2',
'title' => 'Game Of Kill Everyone',
'yr' => '2014',
'author_name' => 'George R. R. Satan',
'author_email' => '[email protected]',
]
];
$resource = new FractalCollection($books, function(array $book) {
return [
'id' => (int) $book['id'],
'title' => $book['title'],
'year' => (int) $book['yr'],
'author' => [
'name' => $book['author_name'],
'email' => $book['author_email'],
],
'links' => [
[
'rel' => 'self',
'uri' => '/books/'.$book['id'],
]
]
];
});
$array = $fractal->createData($resource)->toArray();
dd($array);
cursor: 分页中用的,不会去计算数据库中有多少条数据,通过请求一直在查看下一页有没有,通过cursor来做这个标记,如果没有了,那就返回404,代表分页结束了。
Include: 数据之前通常是有关联的,如用户有帖子,帖子有评论,评论属于帖子等,在restful apis中数据关联都是嵌套的,比如用户的帖子,通过用户include post()函数,就可以在返回用户的时候包含该用户相关联的帖子。
Manager Fractal有一个类叫做Manager,主要管理要将数据格式化为哪一种格式,json,Yaml 等等
Pagination Pagination
Pagination is the process of dividing content into pages, which in relation to Fractal is done in two alternative ways: Cursors and Paginators.
Paginator 一个很屌的用来处理分页的,会先计算数据库中有多少条数据,会添加一个'paginator'在meta中,并且在合适的时候会包含next/previous
resource 是对象,包含哪些基础的数据,会附上transformer,最终会被序列化和输出
Serializer 将Transformer的类 按规定的格式进行序列化,通常最常用的格式是json和HAL,像Twitter, FaceBook, Google都有自定义的一套关于数据传输的格式。
transformer 可以是一个类,也是可以是一个匿名函数,用来处理数据成为你想要的数据,然后可以被序列化。