Laravel 开发 RESTful API 的一些心得
最近用 Laravel 写了一段时间的 API,总结一下自己的心得吧。
Start
API开发我们可以看到,有些网站用token验证身份,有些用OAuth2.0,当时我也纠结,然后看到一个不错的说法。大方面,会涉及到给别人用的使用OAuth,自己使用的用token就足够了
设计最初,最好在路由加个版本号,方便以后扩展。
Route::prefix('v1')->group(function () {
// more
});
如果前端想跨域,请使用这个很方便的包barryvdh/laravel-cors(https://github.com/barryvdh/laravel-cors)
一个简单的接口示例:
验证
API 开发总会离不开验证,这里推荐使用jwt-auth,1.0 快要来了,新版本的文档也很清晰
刚用 jwt-auth
时有疑问,Laravel自带的token验证使用的是数据库apitoken字段验证,而不见 jwt-auth
需要这个。然后想自己看源码,结果 QAQ
,最后去问了官方 ><,原来用户的信息已经存储在token中加密。一开始有疑问,这样保存,不会被解密吗(真为自己智商担忧 !_!)?后来才想起,jwt一开始就运行 php artisan jwt:secret
生成了秘钥,你不泄露就保证安全了~~~
路由
当然使用官方 api
的路由 Route::apiResource()
,一条更比五条强。
路由的名字当然是RESTful的方式。
保持动词,复数形式,见名知义。
有些长的路由,应该用什么分隔呢?
laravel用的是中划线(-),因为谷歌收录时,按中划线划分关键字,国内的是按下划线(_)收录,具体看自己了,我是喜欢下划线 >_<
更多看这里: 路由命名规范(https://laravel-china.org/courses/laravel-specification/502/router)
表单验证
可以使用控制器自带的表单验证,更推荐使用表单类(https://laravel-china.org/docs/laravel/5.5/validation#creating-form-requests),能分离都分离出去,控制器不要处理太多事情。
能分离的代码都不要吝啬~~~
数据转换
Laravel自带的API Resource
用起来真的很方便,不过发现一个问题, --collection
的格式总是转不过来,后来直接放弃了。
单个的使用 Resources
。
集合的使用 Resources::collection()
发现,特别好用 >_<
不得不说,多对多关联时, Laravel
处理得太好了,条件关联:https://laravel-china.org/docs/laravel/5.5/eloquent-resources#resource-responses。
在上面这个例子中,如果关联没有被加载,则 posts 键将会在资源响应被发送给客户端之前被删除。
在有不确定是否输出关联数据时,这是一个很有用的功能!!!
响应输出
当时在 laravel-china 看到的这个帖子,然后觉得这个方式不错,所以自己也这样子,使用基类的方法统一响应输出。
异常
异常算是一大手笔了,处理好异常,可以让你的代码优雅很多。
AppExceptionsHandler::render
方法可以捕获到很多有用的异常,例如,我的代码是这样写的:
UnauthorizedHttpException
这个是捕获 jwt
异常。
ValidationException
这个是表单异常,捕获之后,表单错误消息可以很好的格式化。
ModelNotFoundException
这个是模型找不到的异常,捕获之后,可以直接在控制器直接这样。
// 未捕获之前的写法
public function show($id)
{
$user = User::find($id);
if (! $user) {
}
// do something
}
// 现在
public function show($id)
{
$user = User::findOrFail($id);
}
// 甚至这样
public function show(User $user)
{
// do something
}
下面这两个异常可以不捕获,只是方便开发中查看错误消息
-
NotFoundHttpException
404路由找不到的异常,没什么好说的了 -
MethodNotAllowedHttpException
这个是方法不对应,比如你是get路由,却post请求
文档
差点忘了这个,文档非常非常重要,我是不怎么喜欢在注释写文档的。
使用 swagger-ui
+ swagger-edit
:
- 下载swagger-ui(https://github.com/swagger-api/swagger-ui)
- 只需要
dist
目录的东西(其他可以删除了) - 下载swagger-editor(https://github.com/swagger-api/swagger-editor)
- 只要
dist
目录的东西和根目录的index.html
- 我还把
swagger-editor
的index.html
改成了edit.html
,然后把这两个东西整合到同一个目录(记得修改css,js的位置) - 新建两个文件
api.json
,api.yaml
大概就和图中差不多 - 要修改图中箭头所示成为
api.json
的位置
访问 edit.html
可以书写文档,编写语法:https://www.gitbook.com/book/huangwenchao/swagger/details。
访问 index.html
可以查看文档。
在 edit.html
写好之后,导出 json
,然后粘贴到 api.json
文件。
记得也把写好的格式保存到 api.yaml
,因为清楚缓存之后,下次访问时会消失
自己写了一个packages
就方便创建控制器,验证,所有控制器继承重写过的基类,响应输出方便。
例如完整验证只需要三秒钟:
第一秒: php artisan api:auth
第二秒:出现图代表成功。
第三秒:拿出手臂的劳力士,确定只过了三秒。
更多的使用:laravel-api-helper(https://github.com/DavidNineRoc/laravel-api-helper)
工作和API开发有关,用到其他有经验了再回来补补。
更多参考
RESTful API 设计指南:http://www.ruanyifeng.com/blog/2014/05/restful_api。
觉得本文对你有帮助?请分享给更多人。
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
- python里的单引号和双引号的有什么作用
- 在PHP中输出JS语句以及乱码问题的解决方案
- 使用Keras中的ImageDataGenerator进行批次读图方式
- php用xpath解析html的代码实例讲解
- PHP操作路由器实现方法示例
- python能在浏览器能运行吗
- Python使用OpenPyXL处理Excel表格
- php如何比较两个浮点数是否相等详解
- keras 回调函数Callbacks 断点ModelCheckpoint教程
- Mac下快速搭建PHP开发环境步骤详解
- PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
- Ajax+PHP实现的模拟进度条功能示例
- python实例化对象的具体方法
- PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结