Laravel & Lumen RESTFul API 扩展包:Dingo API(五) —— 转化器(Transformer)_laravel transformer-程序员宅基地

技术标签: Laravel & Lumen RESTFul API 扩展包:Dingo API  

1、简介

通过转化器,你可以将对象转化为数组,并强制转化整型和布尔类型,包括分页结果和嵌套关联。

本章节我们主要讨论转化器及其使用,这里的转化器包括以下两层意思:

  • 转化层(transformation layer)是一个准备和处理转化器的库
  • 转化器(transformer)是一个获取原始数据并将其转化为数组格式的类,处理器的处理方式取决于转化层。

2、使用转化器

有多种方式使用转化器。

为某个类注册转化器

当你为某个类注册转化器后就可以从路由返回这个类(假设它可以被转化为数组)并自动经过转化器处理:

app('Dingo\Api\Transformer\Factory')->register('User', 'UserTransformer');

这在使用模型的简单API中很有用,因为你可以从路由中直接返回模型。

使用响应构建器

参考响应构建器章节。

2、Fractal

Fractal是Dingo API默认的转化层,它提供了一系列有用的特性来保持数据的一致性。

使用Fractal之前建议好好阅读其官方文档。

全自动关联关系渴求式加载

当使用Fractal的内置功能嵌入关联关系时确保其命名和模型中的命名一致。扩展包会自动为你渴求式加载这些关联关系。

高级配置

Fractal以默认配置注册为默认转化层,要手动配置需要在服务提供者中实例化Dingo\Api\Transformer\Adapter\Fractal实例:

$this->app['Dingo\Api\Transformer\Factory']->setAdapter(function ($app) {
     return new Dingo\Api\Transformer\Adapter\Fractal(new League\Fractal\Manager, 'include', ',');
});

如果你使用的是Lumen可以在启动文件(bootstrap.php)中这么做:

app('Dingo\Api\Transformer\Factory')->setAdapter(function ($app) {
    return new Dingo\Api\Transformer\Adapter\Fractal(new League\Fractal\Manager, 'include', ',');
});
通过响应构建器实现高级使用

与响应构建器相结合使用Fractal通常是从控制器返回数据的最佳方式。响应构建器上的itemcollectionpaginator方法都可以接收额外参数用于自定义Fractal。

资源key
return $this->item($user, new UserTransformer, ['key' => 'user']);
使用回调

Fractal转化层允许你注册一个创建资源之后触发的回调,这个回调接收League\Fractal\Resource\Item或者League\Fractal\Resource\Collection作为第一个参数,League\Fractal\Manager实例作为第二个参数。然后你可以使用这个回调在更复杂的层级上与资源进行交互。

最常见的使用案例就是设置分页游标或者修改响应串行:

return $this->collection($users, new UserTransformer, [], function ($resource, $fractal) {
    $resource->setCursor($cursor);
});

如果你不想传递资源key参数可以省略这个空数组:

return $this->collection($users, new UserTransformer, function ($resource, $fractal) {
    $fractal->setSerializer(new CustomSerializer);
});

3、自定义转化层

如果你想对数据转化进行更多的自定义,可以在Dingo API中实现自己的转化层。这需要创建一个实现Dingo\Api\Contract\Transformer\Adapter的类并且实现transform方法:

use Dingo\Api\Http\Request;
use Dingo\Api\Transformer\Binding;
use Dingo\Api\Contract\Transformer\Adapter;

class MyCustomTransformer implements Adapter
{
    public function transform($response, $transformer, Binding $binding, Request $request)
    {
        // Make a call to your transformation layer to transformer the given response.
    }
}

transform是唯一必须的方法,你可以自由添加自己想要的其他方法。transform方法的目的是获取$response,然后和$transformer一起传递给转化层处理,然后转化层会返回一个数组,最终这个数组被transform方法返回。如果你的转化层很简单,可以完全在这个类中实现所有逻辑。

$bindings参数在你的转化层包含更多特性比如添加元数据或者允许开发者通过回调与转化层交互时很有用。

$request参数是当前被执行的HTTP请求,当你的转化层需要查询字符串参数或者其他相关数据时很有用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zzw6236056/article/details/69218574

智能推荐

SpringMVC框架介绍-程序员宅基地

文章浏览阅读10w+次,点赞368次,收藏2.7k次。史上最全最强SpringMVC详细示例实战教程SpringMVC学习笔记----一、SpringMVC基础入门,创建一个HelloWorld程序1.首先,导入SpringMVC需要的jar包。2.添加Web.xml配置文件中关于SpringMVC的配置 springmvc org.springframework.web.servlet.Dispatche..._springmvc框架

08 Translating RNA into Protein-程序员宅基地

文章浏览阅读264次。ProblemThe 20 commonly occurring amino acids are abbreviated by using 20 letters from the Englishalphabet(all letters except for B, J, O, U, X, and Z).Protein stringsare constructed from th..._the 20 commonly occurring amino acids are abbreviated by using 20 letters fr

如何在云服务器上搭建一个自己的博客系统(完整流程梳理)_在自己的云服务器上面搭建自己的博客-程序员宅基地

文章浏览阅读2.7k次,点赞4次,收藏13次。系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、项目下载1.下载地址:1.下载及导入本地。二、搭建前的准备工作。1.Mysql建库,执行数据库建表,生成数据脚本2.将博客项目打成jar包。3.创建项目目录及上传项目配置。3.项目启动及访问三、总结前言前段时间买了一个云服务器一直没怎么用起来,最近突然想起来可以从网_在自己的云服务器上面搭建自己的博客

C# Winform移动窗体、改变窗体大小_winform窗体可拖动变大小属性-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏6次。Winform,拖拽改变窗体大小,自定义改变窗体_winform窗体可拖动变大小属性

freemarker日期转换_freeamker 字符串时间戳转换日期-程序员宅基地

文章浏览阅读3.4k次。将时间戳转换成格式化后的字符串task.startTime 是一个没有毫秒的时间戳 [#assign myDate=(task.startTime+'000')?number?number_to_datetime]${myDate?string("yyyy年MM月dd日HH时mm分")}或者直接这样${(task.startTime*1000)?number_to_datetime?string(_freeamker 字符串时间戳转换日期

Redis 6.0 新特性-多线程连环13问!_redis6.0之前为什么一直不使用多线程?-程序员宅基地

文章浏览阅读353次。Redis 6.0 来了在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境!对于6.0版本,Redis之父Antirez在RC1版本发布时(2019-12-19)在他的博客上连续用了几个“EST”词语来评价:the most “enterprise” Redis version to date // 最”企业级”的the largest release of Redis ever as far a._redis6.0之前为什么一直不使用多线程?

随便推点

CentOS 7设置静态IP地址上网_centos7静态ip设置-程序员宅基地

文章浏览阅读1.3w次。查看网络接口名称图中为ens32 修改接口网络配置文件接口网络配置文件路径存放 cd /etc/sysconfig/network-scripts 其中ifcfg-ens32就是我们所需修改的文件 sudo vim /etc/sysconfig/network-scripts/ifcfg-ens32 需要修改的配置 BOOTPROTO="dhcp" 改为 BOOTP..._centos7静态ip设置

2019 CSP-S第二轮认证Day2试题_csp-s2019 day2-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏4次。2019 CSP-S第二轮认证Day1试题_csp-s2019 day2

yum报错的修改问题_loaded plugins: fastestmirror, product-id, refresh-程序员宅基地

文章浏览阅读353次。使用yum安装软件,有时候由于系统升级会报错。Another app is currently holding the yum lock; waiting for it to exit…The other application is: PackageKitMemory : 48 M RSS (370 MB VSZ)Started: Wed Nov 14 09:29:48 2018 - ..._loaded plugins: fastestmirror, product-id, refresh-packagekit, subscription-

IDEA 快捷键使用_idea 快速输入 return-程序员宅基地

文章浏览阅读118次。创建内容(如构造函数等,getter,setter,hashCode,equals,toString): alt + insertmain 方法 : psvm输出语句(自动补全 system.out.println(" ") ): sout复制一行 : ctrl + d删除一行 : ctrl + y代码向上/下移动 : ctrl + shift + up / down搜索类 :ctrl + n单行或多行注释 :ctrl + / 或 ctrl + shift + /重命名 : shift +._idea 快速输入 return

ACM_模板_最小公倍数_最小公倍数 acm模板-程序员宅基地

文章浏览阅读696次。gcd函数的书写方式有很多种,很多人都是用循环的,而小编的模板用则是用函数的递归,从代码上很简介,且非常易于理解。#include//最小公倍数int gcd(int a,int b){ if(a

QToolButton双击事件_qt toolbutton双击-程序员宅基地

文章浏览阅读902次。继承QToolButton,利用鼠标双击事件实现QToolButton双击事件。_qt toolbutton双击