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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 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周前 评论

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