热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Laravel的API资源功能来构建你的API

文章转发在专业的Laravel开发者社区,原始链接:https:learnku.comlaravelt…在过去的2年时间里,我一直使用Fractal来进行API开发。如果说一个我最

《使用 Laravel 的 API 资源功能来构建你的 API》

文章转发在专业的Laravel开发者社区,原始链接:
https://learnku.com/laravel/t…

在过去的2年时间里,我一直使用 Fractal 来进行 API 开发。

如果说一个我最希望 Laravel可以增加的功能的话,无疑是方便的数据转换,以便开发更好的 API 接口。

别误会, Fractal 很好用,然而我总是希望能只用框架进行开发。如果可以的话,我尽可能不使用类库!我不喜欢使用第三方类库使得开发复杂化。

在过去的一年里,我喜欢使用一些前端框架如 Vue 和 React 来进行开发。因此,我选择只使用 Laravel来建立 API 接口。 而当我需要建立 API 接口 的时候,Fractal是我首选的类库。 现在,情况发生了变化。

在 Laravel 5.5 中,我们有了 API 资源,对此,我真的是非常的兴奋。

在2小时前,Laravel 5.5 发布了,当时我正和朋友一起喝咖啡。当我在半小时前读到这条推的时候,脑子里的第一个想法就是用 API 资源来发布我的第一篇博客文章,我也确实这么做了。

Laravel 的 API 资源是基于 Fractal , 因此,我并没有花太多时间来了解如何使用它。 所以,让我们开始来了解它吧 …

创建 Laravel 应用

用常用的命令行来创建 Laravel 应用

composer create-project laravel/laravel Laravel55Api

应用创建完成后,将 .env.example 重命名为 .env 并用以下命令生成 Laravel 密钥。

php artisan key:generate

启动服务

php artisan serve

很好,接下来是什么呢?

创建一个 Product 资源

API 资源是在 Laravel 中将你的模型以及模型集合转换为 JSON 的新特性。接下来让我们创建一个 Product 的资源。

php artisan make:resource Product

你可以在 app/Http/Resources 目录下看到你刚刚生成的 Product 资源

当然我们还需要 Product 的数据库迁移、模型和控制器。我们能用这个命令快速的创建这些。

php artisan make:model Product -mc

打开数据库迁移文件然后像这样修改 up 方法里面的内容:

public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('price');
$table->timestamps();
});
}

注意这里的价格字段是整型的。 我拜托你们,永远不要用浮点型存储你的价格数据!

一定要用整型来存储!

现在用你的 Laravel 应用连接数据库并运行这个迁移以生成数据表。

本文不是 Laravel 一对一教学贴,所以我不会在连接数据库的问题上浪费你过多的时间。

接下来?

到目前为止,我们已经有模型,控制器,数据库迁移以及用以转换模型和模型集合为 JSON 的资源类。那么接下来呢?

在这之前,什么是资源类?我们在 resources 文件夹中创建的 Product 类又是什么?一个资源类表示了单个模型转换为 JSON 的结构。

结合上面所阐述的,让我们来打开 Product.php 资源类文件。

这里有一个 toArray 方法,这个就是在我们发送响应时返回需要转换为 JSON 的属性数组的方法。

我们来修改它,让我们可以有更好的点子。

public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'price' => $this->price,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}

现在表示我们能够获得有 id, name, price, created_atupdated_at 这些字段的响应。

如果我们在 toArray 方法中去掉 price 字段,返回的 JSON 中就不会有 price 。很酷不是吗?

使用 Product 资源

我们刚刚更改了 toArray 方法,让我们继续在我们的控制器中使用 product 资源。

product 控制器是看起来是这样的:

namespace App\Http\Controllers;
use App\Product;
use App\Http\Resources\Product as ProductResource;
class ProductController extends Controller
{
public function show ($id)
{
return new ProductResource(Product::find($id));
}
}

为了转换 product ,我们仅仅在 product 资源类中传递了一个 product

让我们创建一个 show 方法的路由,看一看结果。

打开 api.php 文件,在中间件外部创建这个路由。

Route::get('/products/{id}', 'ProductController@show');

现在,手动的在你的 products 表里添加一个新的 product,然后访问http://127.0.0.1:8000/api/pro…看看一个简单的 product

你应该得到这样的结果:

《使用 Laravel 的 API 资源功能来构建你的 API》

现在让我们来修改一点我们的资源,假如你不想公开你的 productprice,你要做的就是简单的从你的 toArray 方法删除它。一旦你从 toArray 方法删除了 price,你应该得到这样的结果,当然不包括 price

《使用 Laravel 的 API 资源功能来构建你的 API》

就这些吗?

当然不是!因为 toArray 方法仅仅是一个方法,它意味着你可以包含额外的信息。

假如我们想要包括一个「test」信息,简单的改变你的 toArray 方法。

public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'test' => 'This is just a test',
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}

这是结果:

《使用 Laravel 的 API 资源功能来构建你的 API》

然而,非常要重的是,你希望返回的数据类型总是正确的。在第一个截图上看看 price,它返回的是一个 integer,但是通过 (int) $this->price,我们仍然要强制它是一个integer

现在,看看 create_atupdated_at 时间戳。如果你想要的是返回一个实际时间戳的字符串?那么你可以像这个例子中,强制类型转换为字符串:

public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'test' => 'This is just a test',
'created_at' => (string)$this->created_at,
'updated_at' => (string)$this->updated_at,
];
}

现在的结果是这个:

《使用 Laravel 的 API 资源功能来构建你的 API》

结束语

这仅仅是使用 Laravel API 资源的一个小例子。

如果我继续写下去,这篇文章永远也写不完。

所以,这篇文章就写到这吧,正如你所知道的,我们还有更多话题需要讨论,比如分页、资源集合、关联以及数据包裹等。


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
ACE纞_814
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有