route::resource('users', 'user')注册资源路由,自动生成7条标准restful路由,控制器需严格实现index/create/save/read/edit/update/delete方法,且必须继承think\controller;put/delete需手动解析php://input。

ThinkPHP5 实现 RESTful 接口,核心不是写一堆 get/post 路由凑数,而是用 Route::resource() 声明资源、控制器严格对齐 7 个方法名、手动处理请求体——漏掉任一环,PUT 拿不到参数、DELETE 走进 index、/users/123 返回 404 就是常态。
Route::resource() 怎么注册才不踩坑
资源路由必须显式注册在 route/app.php 中,且不能被其他规则提前拦截或包裹错层级。
- 错误写法:
Route::get('users', 'User@index')+ 单独补Route::put('users/:id', 'User@update')—— 这不算资源路由,只是手工拼凑,失去自动绑定和命名优势 - 正确姿势:直接写
Route::resource('users', 'User'),框架会自动生成 7 条标准路由(GET /users→index,PUT /users/:id→update等) - 带版本前缀时别硬塞路径:写
Route::prefix('api/v1')->group(function () { Route::resource('users', 'User'); });,而不是Route::resource('api/v1/users', 'User')(后者会导致控制器无法解析v1段) - 命名路由方便生成 URL:
Route::resource('users', 'User')->name('api.users'),之后可用url('api.users/read', ['id' => 5])
控制器方法名必须是这 7 个:index/create/save/read/edit/update/delete
ThinkPHP5 的资源路由靠方法名和 HTTP 动词双重匹配,写成 show() 或 destroy() 就完全失效。
- 常见错误现象:
GET /users/5被路由到index()而非read();DELETE /users/5报 404 或进index() - 控制器必须继承
think\Controller(不是think\BaseController),否则__call()拦截器不触发,动词映射就断了 -
save()对应POST /users(新建),update()对应PUT /users/:id(更新),别把逻辑混在同一个方法里 - 方法参数可选类型提示:
public function read($id)或public function read(Request $request, $id),但$id必须作为第一个位置参数接收
POST/PUT/DELETE 请求体怎么取数据
save()、update()、delete() 方法**不会自动调用 input() 或 param()**,你得自己读原始输入并解析。
- 表单提交(
Content-Type: application/x-www-form-urlencoded):$this->request->post()可用,但注意 TP6+ 默认 trim 首尾空格,若字段允许空格需手动$this->request->post('name', '', 'htmlspecialchars') - JSON 提交(
Content-Type: application/json):$this->request->post()和input()全部失效,必须用file_get_contents('php://input')读原始流,再json_decode($raw, true) ?: [] - PUT 请求同理:
if ($this->request->isPut()) { $raw = file_get_contents('php://input'); $data = json_decode($raw, true) ?: []; } - 想后续用
$this->request->put('name')?可以,但要先手动注入:$this->request->put($data)
为什么 /users/5 总是 404 或进错方法
最常忽略的是 URL 重写和参数解析机制——TP5 默认依赖 PATH_INFO,而 Apache/Nginx 配置不对,:id 根本传不到路由层。
- Apache 下确保
.htaccess开启且生效:RewriteCond %{REQUEST_FILENAME} !-d+RewriteCond %{REQUEST_FILENAME} !-f+RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] - Nginx 下需配置
fastcgi_param PATH_INFO $fastcgi_path_info;,并启用try_files $uri $uri/ /index.php?$query_string; - 检查
app_debug = true时的路由调试页,确认/users/5是否出现在已注册路由列表中,以及匹配的变量名是不是id - 别开启
url_convert(默认开),它会把user_info转成user-info,但资源路由只认下划线命名,混用直接失配
真正卡住人的地方,往往不是语法写错,而是 php://input 没读、PATH_INFO 没透传、方法名少写了个 e(upadte → update),或者以为框架会自动帮你解 JSON —— 它不会。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











