最常见原因是未携带csrf token:laravel默认开启csrf防护,所有post/put/patch/delete请求必须包含有效_token字段,表单需添加@csrf或,否则请求可能被verifycsrftoken中间件直接拦截,无法到达控制器。

检查 CSRF token 是否缺失或错误
表单提交后 request()->all() 返回空数组,最常见原因是没带 CSRF token。Laravel 默认开启 CSRF 防护,所有 POST/PUT/PATCH/DELETE 请求必须携带有效 _token 字段。
确认表单里有:
<input type="hidden" name="_token" value="{{ csrf_token() }}">或者用 Blade 指令:@csrf
- 如果手写表单但漏了
@csrf或csrf_token(),request()->has('xxx')会返回false,且整个请求可能被中间件直接拦截(不进控制器) - 使用 Vue/React 等前端框架时,需手动在请求头加
X-CSRF-TOKEN,否则即使表单有 token,AJAX 提交也会被拒绝 - 运行
php artisan config:clear后未重生成 session,可能导致 token 无效——可临时用dd(session()->token())对比表单中实际值
确认请求方法和路由是否匹配
Laravel 路由对 HTTP 方法敏感,POST 表单若指向一个只定义了 get 的路由,请求会被 405 Method Not Allowed 拦截,根本不会到达控制器逻辑,自然拿不到任何参数。
- 用浏览器开发者工具的 Network 面板看实际发出的请求方法、状态码和响应头;405 或 419 错误会直接暴露问题
- 检查路由定义:比如
Route::get('/submit', ...)不能接收 POST,应为Route::post('/submit', ...)或Route::match(['get', 'post'], ...) - 表单
method属性写错(如method="post"正确,method="POST"在某些旧浏览器可能出问题,建议小写)
排查请求内容类型(Content-Type)是否合规
如果前端用 fetch 或 axios 提交,但没设好 header,Laravel 可能无法解析请求体。默认只有 application/x-www-form-urlencoded 和 multipart/form-data 能被 request() 正常读取。
-
Content-Type: application/json时,request()->get('field')拿不到值,得用request()->json()->get('field') - 用
multipart/form-data传文件时,普通字段仍可用request()->input('xxx'),但别误用request()->query('xxx')(那是 GET 参数) - 调试技巧:在控制器开头加
dd(request()->all(), request()->headers->all(), request()->getContent()),一眼看出原始数据在哪、是否被解析
检查中间件是否提前终止或修改了请求
自定义中间件或第三方包(比如权限校验、日志、API 认证)可能调用了 return response() 或 abort(),导致请求没走到控制器;也可能调用 $request->replace(...) 清空了输入。
- 执行
php artisan route:list,确认目标路由绑定的中间件列表,逐个排查是否有可疑逻辑 - 临时注释掉中间件,比如在
app/Http/Kernel.php中把web或api中间件组里的自定义项去掉,再测试 - 特别注意
TrimStrings、ConvertEmptyStringsToNull这类内置中间件——它们不会让值“消失”,但会让空字符串变成null,容易误判为“拿不到”
真正卡住的时候,往往不是 Laravel “收不到”,而是请求压根没进控制器,或数据藏在别的地方(比如 JSON body、header、query string)。先盯死 Network 面板的状态码和 payload,再看中间件和路由,最后查 token 和 content-type——顺序错了,花半天也找不到源头。











