Fractal 文档(看完看dingo的transformer)

什么是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' => 'philip@example.org',
            ],
            [
                'id' => '2',
                'title' => 'Game Of Kill Everyone',
                'yr' => '2014',
                'author_name' => 'George R. R. Satan',
                'author_email' => 'george@example.org',
            ]
        ];

        $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 可以是一个类,也是可以是一个匿名函数,用来处理数据成为你想要的数据,然后可以被序列化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,014评论 19 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,259评论 4 61
  • 在《<边城>题记》中沈从文说:“但本书作者,却早已存心把这个‘多数’放弃了。”费孝通在《乡土中国》正文首句就说:“...
    宜梦阅读 555评论 0 2
  • 又是一年团圆时,怎奈归途坎坷路。有多少人加入了十几亿人回家的艰难大军中,买火车票,机票,汽车票,骑摩托车回家的都有...
    韩小冰阅读 435评论 0 5
  • “你是一个焦虑症患者” 也许见医生的话 医生会给我这样的症断书 我没病 一点也没有 我也没有世界给我的压力 我不悲...
    7evenyears阅读 203评论 0 0