必须用 except:表单提交过滤 csrf token 等框架字段、更新用户时排除 password 等敏感字段、api 忽略 debug 等调试字段;优先用 only:创建订单、搜索接口、第三方对接等需白名单控制的场景;all 需谨慎,易导致信息泄露或校验缺失。

选 only、except 还是 all,不看文档标题,只看三点:你要不要过滤、哪些字段可信、有没有隐藏字段要剥离。
什么时候必须用 except
最常见于表单提交后过滤敏感或框架字段。比如 CSRF token、_method、_token 这类 Laravel 自动注入的字段,不该进业务逻辑或数据库。
- 用户注册时,
$request->except('_token')是安全底线,漏掉可能让 token 被误存或触发异常校验 - 更新用户资料时,
$request->except(['password', 'password_confirmation'])避免把明文密码写进模型更新语句 - API 接口接收参数但需忽略前端传来的调试字段(如
debug、trace_id),except比手动unset更可靠
什么时候优先用 only
only 是白名单思维,适合字段明确、来源不可信的场景。它不依赖“哪些不该要”,而是“只准要哪些”。
- 创建订单时,只允许传
['product_id', 'quantity', 'address_id'],其余一概丢弃 —— 防止攻击者伪造status=confirmed或amount=0.01 - 搜索接口中,
$request->only(['q', 'page', 'per_page', 'sort'])明确限定可被解析的查询参数,避免?admin=true&bypass=1类干扰 - 和第三方系统对接时,对方可能多传字段,用
only可避免因未知字段引发的模型赋值异常(比如 Eloquent 的$fillable未覆盖时)
all 不是懒,是需要明确承担风险
all 返回全部输入,包括空字符串、null、甚至数组嵌套结构。它本身没错,但容易掩盖数据校验缺失。
- 如果你后续没做
validate或字段存在性检查,$request->all()直接进create()可能导致数据库报错(如 NOT NULL 字段为空) - 在 API 响应中返回
$request->all()给前端,可能意外暴露_token或调试字段,属于信息泄露 - 配合
Model::create($request->all())使用时,等价于绕过$fillable白名单 —— 除非你真设了$guarded = [],否则会抛MassAssignmentException
真正容易被忽略的是:这三个方法对空值的处理完全一致,不会自动过滤 null 或空字符串。如果业务要求“非空才取”,得额外加 filter() 或验证规则,不能指望 only 或 except 替你做这层判断。











