使用 php artisan make:controller api/usercontroller --api 生成精简的 restful api 控制器,仅含 index、store、show、update、destroy 五个方法,不带视图相关逻辑,需手动注册路由至 routes/api.php 并返回显式 json 响应。

php artisan make:controller 生成 API 控制器要加 --api 参数
不加 --api 会生成带 create、edit 这类视图相关方法的控制器,和 API 场景不匹配——你不需要返回 Blade 页面,也不该暴露 GET /users/create 这种路由。
正确命令是:
php artisan make:controller Api/UserController --api
它只生成 index、store、show、update、destroy 五个 RESTful 方法,且默认不带 __construct() 中的中间件绑定(这点后面会提)。
-
--api不影响命名空间,生成的控制器仍在App\Http\Controllers下,如需分组建议手动移到App\Http\Controllers\Api并调整命名空间 - 生成的类不会自动加
extends Controller的use Illuminate\Routing\Controller;,但 Laravel 10+ 默认已引入,不用额外处理 - 别指望
--api自动注册路由——它只管生成代码,路由还得自己写在routes/api.php里
API 路由必须定义在 routes/api.php,不能混进 web.php
routes/web.php 套了 web 中间件组,自带 session、CSRF、加密 cookie 等机制,对纯 JSON API 来说多余且可能出问题:比如 POST 请求被 CSRF 中间件拦截,返回 419 Page Expired。
所有 API 路由请严格放在 routes/api.php,它默认套的是 api 中间件组(空的),更干净。
- 如果要用 auth:sanctum 或 auth:api,请显式加在路由定义里,例如:
Route::middleware('auth:sanctum')->get('/user', [UserController::class, 'show']); -
api.php中的路由自动加了前缀/api/(见RouteServiceProvider),所以Route::get('users', ...)实际访问路径是/api/users - 别手动在
api.php里写Route::prefix('api')——重复加前缀会导致路径变成/api/api/users
控制器方法要明确返回 JSON,别依赖 view() 或 redirect()
Laravel 默认控制器方法如果没 return,会尝试渲染同名 Blade 模板;API 场景下这会导致 InvalidArgumentException: View [index] not found 或静默返回空响应。
每个方法必须显式 return JSON 响应:
- 用
response()->json()最稳妥,可控制状态码、headers:return response()->json(['data' => $users], 200); -
->withHeaders()可追加 CORS 相关头,但生产环境建议统一用fruitcake/laravel-cors包管理 - 别直接
return $users(即使它是数组或 Eloquent 集合)——Laravel 会自动转 JSON,但无法设状态码,出错时难定位 - 模型直接
return $user会触发隐式 toJson(),但若模型含未隐藏字段(如$casts或appends)可能泄露敏感数据,建议用toArray()或资源类封装
复杂逻辑别堆在控制器里,用 Request 类 + Resource 类解耦
控制器不是写业务逻辑的地方。参数校验写在 StoreUserRequest 类里,响应结构用 UserResource 封装,否则很快变成“上帝控制器”——改个字段要翻 200 行,加个权限判断得到处 patch。
- 生成表单请求类:
php artisan make:request StoreUserRequest,在rules()里写验证规则,authorize()里做权限检查 - 生成资源类:
php artisan make:resource UserResource,把toArray()逻辑移进去,控制器里只写return new UserResource($user); - 资源集合别漏掉
collection方法,否则UserResource::collection($users)会报错 - Request 类默认没加到容器绑定,要用
public function store(StoreUserRequest $request)才能自动注入并触发验证
API 控制器真正的难点不在生成,而在边界划分:什么时候该扔给 Service,什么时候该交给 Policy,什么时候 Resource 该扁平化还是嵌套——这些没标准答案,但一开始就硬编码在控制器里,后面基本没法测也没法换。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











