laravel rest接口应使用route::apiresource()注册资源路由,配合--api生成的控制器和自动json响应,避免混用web路由导致419错误;验证用$request->validate(),统一结构时按需添加resource类。

用 Laravel 写 REST 接口,核心就是资源控制器 + apiResource 路由 + 正确的中间件环境。不靠手动写一堆 Route::get/post/put,而是让框架按规范自动生成、自动绑定、自动解析 JSON——这才是高效又少出错的方式。
必须用 Route::apiResource() 注册路由
在 routes/api.php 中,只用这一行:
use App\Http\Controllers\PostController;
Route::apiResource('posts', PostController::class);
它会自动注册 5 条标准 REST 路由(index、store、show、update、destroy),并启用 api 中间件组(含限流、模型绑定,不含 CSRF 和 Session)。
⚠️ 切忌混用 Route::resource():它走的是 web 中间件,会导致 POST/PUT 请求直接返回 419(CSRF token mismatch),或 $request->all() 拿不到 JSON 数据。
用 --api 参数生成控制器
运行命令:
php artisan make:controller Api/V1/PostController --api
生成的控制器天然适配 API 场景:
- 只保留
index、store、show、update、destroy方法,没有create/edit这类 HTML 页面方法 - 方法签名已对齐:如
update(Request $request, Post $post),支持自动模型绑定和 JSON body 解析 - 不包含任何
return view()或 session 相关逻辑,避免响应头污染或意外 HTML 输出
数据验证与响应可直接简化
控制器方法里不需要每处都写 response()->json():
-
return Post::all();→ 自动转为 JSON + 200 状态码 -
return Post::findOrFail($id);→ 自动转为 JSON + 200;找不到则自动 404 -
return response()->json($data, 201);仅在创建成功时显式设 201(符合 REST 规范) - 验证推荐用
$request->validate(),例如:$request->validate(['title' => 'required|string|max:255']);
需要统一输出结构时再加 Resource 类
裸模型返回够用时,不用强加 Resource。但当你遇到这些情况,就该上 PostResource:
- 隐藏敏感字段(如
password_hash、remember_token) - 嵌套关联数据(如文章返回作者名、评论数)
- 字段重命名或条件展示(如只对管理员显示
is_draft)
生成并使用方式:
php artisan make:resource PostResource
// 在控制器中
use App\Http\Resources\PostResource;
public function index()
{
return PostResource::collection(Post::all());
}
public function show(Post $post)
{
return new PostResource($post);
}
不复杂但容易忽略:Resource 是增强层,不是必需层。先跑通业务逻辑,再按需精修输出。











