美文网首页
Fractal 文档(看完看dingo的transformer)

Fractal 文档(看完看dingo的transformer)

作者: ZhouJiping | 来源:发表于2016-06-02 14:42 被阅读803次

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

    相关文章

      网友评论

          本文标题:Fractal 文档(看完看dingo的transformer)

          本文链接:https://www.haomeiwen.com/subject/sdqkdttx.html