laravel8中如何让表单验证器只允许指定字段被提交?

1. 运行环境#

1). 当前使用的 Laravel 版本?#

laravel8

2). 当前使用的 php/php-fpm 版本?#

PHP 版本:php7.4

php-fpm 版本:无

3). 当前系统#

windows 10

4). 业务环境#

开发环境

5). 相关软件版本#

mysql8

2. 问题描述?#

postman 提交了这个数据

{
    "name":"test",
    "description":"des",
    "aaa":"123"
}

我在 laravel 的表单验证器里面写了如下验证规则

laravel8中如何让表单验证器只允许指定字段被提交

3. 您期望得到的结果?#

我希望 postman 只能提交 namedescription 这两个字段,一旦提交多余的字段就会在返回错误信息。
不在 controller 层写任何的逻辑。能否直接在表单验证器的某个设置选项或者重写某个方法达到我的目的?

4. 您实际得到的结果?#

我的 contoller 中写的代码如下,也确实可以拿到。但是我就是不希望可以提交额外的字段😂

laravel8中如何让表单验证器只允许指定字段被提交

5. 我有这个想法的原因#

springboot 中接收一个 json 的时候,可以用一个对象来接收的。
这个对象只有 a 和 b 两个属性。
一旦接收的 json 里面包含 a 和 b 之外的属性就会返回错误。

因此我感觉 laravel 也有这个能力,但是我核对了文档 表单验证这个文档,确实没有找到相关设置。

附言 1  ·  2年前

使用 "前置验证器 (prepareForValidation)" 或 "后置验证器 (passedValidation)" 。

两个验证器的位置在 vendor\laravel\framework\src\Illuminate\Validation\ValidatesWhenResolvedTrait.php

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

在你的验证器里的后置函数里写一下可以

    /**
     * Handle a passed validation attempt.
     *
     * @return void
     */
    protected function passedValidation()
    {
        $validated = $this->validated();
        $data = $this->validationData();
        if($validated != $data){
            abort(400, '参数错误');
        }
    }
2年前 评论
sinmu (楼主) 2年前
讨论数量: 15

在你的验证器里面加一个前置验证

    /**
     * 准备验证数据。
     *
     * @return void
     */
    protected function prepareForValidation()
    {
        if (!empty($this->except(array_keys($this->rules())))) {
            dd('你传了多余的东西啦');
        }
    }
2年前 评论

个人感觉可以写个中间件在中间件里面处理,request->all 取出来遍历 只要 key 不是 name or description 那就直接异常

2年前 评论
sinmu (楼主) 2年前
Aroad (作者) 2年前
sinmu (楼主) 2年前

无用的参数可以直接过滤掉 使用 request->only (['name','description'])

2年前 评论
sinmu (楼主) 2年前
Siam 2年前
sinmu (楼主) 2年前

验证后的钩子,可以在这里处理。 表单验证《Laravel 9 中文文档》

2年前 评论

在你的验证器里的后置函数里写一下可以

    /**
     * Handle a passed validation attempt.
     *
     * @return void
     */
    protected function passedValidation()
    {
        $validated = $this->validated();
        $data = $this->validationData();
        if($validated != $data){
            abort(400, '参数错误');
        }
    }
2年前 评论
sinmu (楼主) 2年前

在你的验证器里面加一个前置验证

    /**
     * 准备验证数据。
     *
     * @return void
     */
    protected function prepareForValidation()
    {
        if (!empty($this->except(array_keys($this->rules())))) {
            dd('你传了多余的东西啦');
        }
    }
2年前 评论
sanders

我一般会忽略客户端多传的内容 用 $request->only() 传递参数解决这个问题。

2年前 评论
sinmu (楼主) 2年前

AppServiceProvider 中 boot 方法 注入 Validator::includeUnvalidatedArrayKeys(); 以免漏掉不需要验证的 key,再结合 $request->validated() 处理起来比较舒服 这个支持 9.x 版本

验证规则多余的 key

2年前 评论