应优先使用 param(),它自动合并 get、post 和路由参数,适用于 90% 场景;仅在需严格隔离请求来源时用 get() 或 post()。

直接用 request()->param() 就够了,90% 场景下不需要区分 GET/POST。 其他方法如 get()、post() 只在极少数需严格隔离请求来源时才用,盲目拆分反而容易漏参数或引发兼容问题。
什么时候该用 param() 而不是 get() 或 post()
当你的接口或表单既可能走 URL 查询(GET),也可能走表单提交(POST),甚至带路由变量(如 /user/123)时,param() 会自动合并三者,避免手动判断请求类型。
-
param()默认包含$_GET、$_POST和路由匹配出的参数(route类型) -
get()只读$_GET,post()只读$_POST,对 PUT/DELETE 请求不生效 - RESTful 接口、AJAX 表单、小程序 POST 请求都推荐统一用
param(),否则容易收不到数据 - 若你明确只要 URL 上的值(比如分页
?page=2),且后端禁止 POST 覆盖,才用get('page')
param() 怎么安全取值:过滤、默认值、嵌套字段
它支持链式过滤和默认兜底,比手写 htmlspecialchars($_GET['name'] ?? '') 更简洁也更可靠。
- 取单个值并过滤:
request()->param('username', '', 'htmlspecialchars,trim') - 取嵌套数组字段(如
data[info][email]):request()->param('data.info.email') - 取数组类型(如多选框
hobby[]=read&hobby[]=code):request()->param('hobby/a')—— 必须加/a修饰符,否则返回字符串 - 没传值时返回默认值:
request()->param('status', 'draft')
为什么 only() 和 except() 比手动 unset() 更合适
它们是白名单/黑名单机制,天然防注入,尤其适合接收表单数据后只保留必要字段再入库。
-
request()->only(['title', 'content', 'category_id']):只取这三项,其余全丢 -
request()->except(['token', 'submit_time']):排除敏感或冗余字段 - 注意:
only()不校验字段是否存在,如果传了空值也会保留;如需非空校验,应配合验证器使用 - 别用
array_diff_key($_POST, ['token' => ''])这类原生操作,绕过框架过滤逻辑,有安全隐患
依赖注入和参数绑定不是“炫技”,而是减少样板代码的关键
控制器方法里直接声明参数名,框架会自动从 param() 绑定值,连 request() 都不用写了。
- 这样写:
public function edit($id = 0, $name = '') { ... },访问/edit/id/123/name/test或/edit?id=123&name=test都能拿到值 - 必须给默认值(如
$id = 0),否则没传参时 PHP 会报Missing argument错误 - 参数顺序无关,但命名要和请求字段一致;若字段含点号(如
user.email),方法参数名得用下划线($user_email)或改用param()显式取 - 参数绑定默认启用,无需额外配置;只有当你启用了
'url_param_type'=>1(按顺序绑定)才需注意位置
真正容易被忽略的是数组字段的 /a 修饰符和参数绑定时的默认值——漏掉前者导致数组变字符串,漏掉后者让接口在缺失参数时直接 500。其他都是顺手的事。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











