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  ·  1年前

使用 "前置验证器(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, '参数错误');
        }
    }
1年前 评论
sinmu (楼主) 1年前
讨论数量: 15

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

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

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

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

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

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

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

1年前 评论

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

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

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

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

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

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

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

验证规则多余的key

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!