RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1061562
Accepted
MoloF
MoloF
Asked:2020-12-22 00:41:13 +0000 UTC2020-12-22 00:41:13 +0000 UTC 2020-12-22 00:41:13 +0000 UTC

Laravel 表单请求验证 | 解析文件,然后验证其内容

  • 772

我要验证一个.json文件。

在控制器中:

public function import(ImportPost $request)
{
    ProcessImport::dispatch($request->validated());
    return redirect()->back();
}

ImportPost 文件本身包含以下代码

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ImportPost extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'file' => 'required|file|max:10000',
        ];
    }
}

文件本身使用以下方法解析:

json_decode(File::get($request->file('file')), true);

那么,我怎样才能解析这个文件并在以后验证它呢?

也就是说,最初这是一个file.json文件,我想按重量检查它,并根据其中包含的其他字段检查它的内容。

我假设能够创建两个验证器并首先检查文件本身,然后检查其内容。这种方法正确吗?

php
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    user256824
    2020-12-22T15:45:43Z2020-12-22T15:45:43Z

    当要检查的字段不仅位于请求中,而且是动态形成的,或者它们必须永久存在时,验证选项。

    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Support\Facades\File;
    use Illuminate\Foundation\Http\FormRequest;
    
    class ImportPostRequest extends FormRequest
    {
      /**
       * Имя поля файла с данными для проверки.
       * @var string
       */
      const FILE_FIELD_NAME = 'file';
    
      /**
       * Подготовить данные для проверки.
       *
       * @return void
       */
      protected function prepareForValidation()
      {
        // Проверим сам файл, перед тем как
        // собрать необходимые данные для проверки.
        // Используем отдельный экземпляр валидатора,
        // созданный через функцию-помощник.
        validator($this->only(self::FILE_FIELD_NAME), [
            'file' => [
              'required',
              'file',
              'max:10000',
            ]
          ])
          ->validate();
    
        // `merge`- добавляем необходимые поля для проверки.
        $this->merge(json_decode(
          File::get($this->file(self::FILE_FIELD_NAME)
        ), true));
      }
    
      /**
       * Получите данные для проверки из запроса.
       *
       * @return array
       */
      public function validationData(): array
      {
        // `except` - получить массив полей, исключив ненужные.
        $input = $this->except([
          self::FILE_FIELD_NAME,
          '_token',
          '_method',
          'submit',
    
        ]);
    
        // `replace` - заменить поля на новые.
        // `merge` - добавить другие поля.
        return $this->replace($input)
          ->merge([
            // Еще можно легально добавить поля здесь.
          ])
          ->all();
      }
    
      /**
       * Получить правила проверки,
       * которые будут применены к запросу.
       *
       * @return array
       */
      public function rules(): array
      {
        return [
          'key' => [
            'required',
          ],
    
        ];
      }
    }
    
    
    • 2
  2. MoloF
    2020-12-22T04:49:16Z2020-12-22T04:49:16Z

    Laravel - ^6.2

    PHP - ^7.2


    您需要使用withValidator() 钩子;这个钩子是什么?

    public function withValidator(Validator $validator)
    {
        $validator->after(function ($validator) {
            $data = json_decode(File::get($this->file), true);
            $rules = [
                'key' => 'required'
            ];
            $validate = \Illuminate\Support\Facades\Validator::make($data, $rules);
            $validate->validate();
        });
    }
    

    Validator 类包含在文件的开头:

    use Illuminate\Contracts\Validation\Validator;
    

    至于验证器本身,在下面的第 8 行,我在那里明确指出了所有内容。

    通过使用\Illuminate\Support\Facades\Validator

    最后,我调用了 validate() 方法;遵守规则。

    我不完全确定这是否正确,但我没有找到必要的官方文档,所以下面的乡巴佬代码有一个地方。


    完整的文件如下所示:

    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Support\Facades\File;
    use Illuminate\Foundation\Http\FormRequest;
    use Illuminate\Contracts\Validation\Validator;
    
    class ImportPost extends FormRequest
    {
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'file' => 'required|file|max:10000',
            ];
        }
    
        public function withValidator(Validator $validator)
        {
            $validator->after(function ($validator) {
                $data = json_decode(File::get($this->file), true);
                $rules = [
                    'key' => 'required'
                ];
                $validate = \Illuminate\Support\Facades\Validator::make($data, $rules);
                $validate->validate();
            });
        }
    }
    

    底线 - 我的问题用withValidator();解决了

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5