【问题标题】:Validate all JSON requests in Laravel验证 Laravel 中的所有 JSON 请求
【发布时间】:2020-10-01 01:43:14
【问题描述】:

我正在使用 RegisterRequest 请求类创建一个注册函数,它应该验证请求:

public function register(RegisterRequest $request)
{
  //
}

请求验证(RegisterRequest)如下所示:

<?php

namespace App\Http\Requests\Api\User;

use App\Http\Requests\Request;

class RegisterRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; // TODO: should secure this.
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required|email|unique:users,email',
        ];
    }
}

但我收到名称和电子邮件丢失的错误,我认为这是因为请求是以 JSON 格式发送的。如何使此请求验证我提供的 JSON 输入?提前致谢。

我提出请求的方式:

handleSubmit (data) {
      // Register User
      this.$http
        .post('/api/user/register', data)
        .then(response => {
          console.log(response)
          // Clear form
          // Show snackbar
        })
        .catch(error => {
          console.error(error)
        })
        .finally(
          // Update items in DataTable
          console.log(data)
        )
    }

当我console.log(data); 时,它会告诉我这个:

{"name":"asdsfsdf","email":"sdfsfd@sdfs.com"}

当我尝试这样验证时:

       $validator = Validator::make($request->json()->all(), [
            'name' => 'required',
            'email' => 'required|email|unique:users,email',
        ]);

它可以工作,但我想将此逻辑与控制器分开。

【问题讨论】:

  • 无论是不是 JSON,请求应该仍然通过。在浏览器中按 F12 并检查请求以查看数据是否实际发送到服务器
  • 当我 dd() $request 我得到这个:array:1 [ "{"name":"sdfsafsa","email":"fdsafa@sdfs_com"}" =&gt; null ]

标签: json laravel


【解决方案1】:

根据您的评论,您没有将数据正确发送到服务器 --- 您将其作为数组键发送。在您的 AJAX/request 调用中,发送数据如下(我使用 axios 库作为演示,但架构也可以应用于 jquery 或其他 js 工具):

axios.post('/link/to/web/route', {
    name: 'my name',
    email: 'my email',
}).then(response=>{
    alert('Data sent with success!')
}).catch(error=>{
    alert('Error has occurred. Please check browser console');
    console.log(error)
})

【讨论】:

  • 即使我使用你的答案,它也会显示the name field is requiredthe email field is required
【解决方案2】:

我设法通过使用prepareForValidation 方法(https://laravel.com/docs/7.x/validation#prepare-input-for-validation)修复它:

    protected function prepareForValidation()
    {
        $this->merge([
            'name' => $this->json('name'),
            'email' => $this->json('email')
        ]);
    }

现在,规则函数可以成功验证 JSON 输入。

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 2015-10-20
    • 2015-12-24
    • 2015-11-25
    • 2017-11-21
    • 2020-01-13
    • 2021-06-28
    • 2018-01-24
    • 2017-10-01
    相关资源
    最近更新 更多