Laravel 开发 RESTful API 的心得

2018-03-01 23:17:46 +08:00
 DavidNineRoc

最近用 Laravel 写了一段时间的 API,总结一下自己的心得吧。

Start

Route::prefix('v1')->group(function () {
	// more
});

一个简单的接口示例

验证

路由

表单验证

可以使用控制器自带的表单验证,更推荐使用 表单类,能分离都分离出去,控制器不要处理太多事情。 能分离的代码都不要吝啬~~~

数据转换

响应输出

当时在 laravel-china 看到的这个帖子,然后觉得这个方式不错,所以自己也这样子,使用基类的方法统一响应输出。

异常

异常算是一大手笔了,处理好异常,可以让你的代码优雅很多。 \App\Exceptions\Handler::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
}

文档

自己写了一个packages


工作和API开发有关,用到其他有经验了再回来补补。

更多参考

RESTful API 设计指南


ps:用错账号发了,用这个补一下

4302 次点击
所在节点    PHP
15 条回复
johnnie502
2018-03-02 04:21:47 +08:00
为啥要用 Laravel,这种场景是属于 Lumen 的
tSQghkfhTtQt9mtd
2018-03-02 11:16:19 +08:00
手表笑喷🤣
DavidNineRoc
2018-03-02 11:53:31 +08:00
@johnnie502 lumen 有很多功能没有,表单分离验证,数据转换,laravel 官方文档都有 apiResource 路由,所以开发 API 妥妥的,何必省这点性能呢。玩 lumen 想用 laravel 的某些功能时,总想用什么包,或者怎么写才能实现 laravel 的一些功能,所以,花点钱买好的服务器。
DavidNineRoc
2018-03-02 11:53:51 +08:00
@liwanglin12 需要买一个吗?童叟无欺
carlclone
2018-03-02 12:40:00 +08:00
你需要 Laravel Passport , dingo api , JWT
Jarvix
2018-03-02 14:30:45 +08:00
make
DavidNineRoc
2018-03-02 14:35:06 +08:00
@carlclone passport 得看应用场景,我觉得我完全不需要,dingo api 我觉得 lv-5.5 已经有很多功能满足了我的需求,重要的部分验证,数据转换,文档 我都觉已经足够了。
jwt 我又写了,用的 jwt-auth,dingo 内置也是用这个,我单独使用而已
z5864703
2018-03-05 10:14:20 +08:00
异常处理里面引入控制器来做资源返回?这样处理方式不太好吧
DavidNineRoc
2018-03-05 13:03:43 +08:00
@z5864703 主要是为了统一处理响应,而不是直接使用 `response()`
z5864703
2018-03-05 14:03:17 +08:00
@DavidNineRoc 那用 trait 就好了
DavidNineRoc
2018-03-05 14:12:39 +08:00
@z5864703 trait 是无法实例化的。
z5864703
2018-03-05 17:37:55 +08:00
@DavidNineRoc 为什么要实例化...感觉你不清楚 trait 是干嘛用的...
DavidNineRoc
2018-03-05 17:58:18 +08:00
@z5864703 无力吐槽了,是你问我用 trait 就好了,而我告诉你 trait 无法实例化。是因为我的 ApiController 的方法来自于 trait,我这样说可否讲清楚一点了吗?
而且你肯定没有看源码,我并不是返回 ApiController,而是通过内部的 toJson()。好吧是我没说清楚。
https://github.com/DavidNineRoc/laravel-api-helper/blob/master/src/Services/ResponseServe.tpl#L126-L134
z5864703
2018-03-07 10:17:13 +08:00
@DavidNineRoc 那这更有问题了,ApiController 的方法来源于写的一个 trait,那异常这里直接 use 这个 trait 就好了,还得中间再耦合一个控制器进来,不是多此一举么。和能不能实不实例化有关系么?所以我说你不清楚 trait 干嘛用的,你现在描述的和你的源码更证明了这个观点。。。
DavidNineRoc
2018-03-07 11:29:32 +08:00
@z5864703 异常做异常该做的事,为什么返回做 json 响应呢?我使用 ApiController 是因为:当以后我改变了 ApiController 里面的代码,比如响应状态码,现在是 200 是成功,我以后要用 0 做为成功,而我用 ApiController 统一调用,以后不需要懂异常的代码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/434082

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX