Laravel 5 表单请求数据预处理

2022-08-30 12:38:09

我正在处理一个表单,用户可以在其中更新其出生日期。表单为用户提供了 3 个单独的字段,用于 、 和 。当然,在服务器端,我想将这3个单独的字段视为一个值,即.daymonthyearyyyy-mm-dd

因此,在验证和更新我的数据库之前,我想通过连接来更改表单请求以创建字段,并使用字符创建我需要的日期格式(并且可能取消设置原始的3个字段)。date_of_birthyearmonthday-

使用我的控制器手动实现此目的不是问题。我可以简单地获取输入,将用字符分隔的字段连接在一起并取消设置它们。然后,我可以在传递到命令以处理处理之前手动验证。-

但是,我更喜欢使用 a 来处理验证,并将其注入到我的控制器方法中。因此,我需要一种在执行验证之前实际修改表单请求的方法。FormRequest

我确实发现了以下类似的问题:Laravel 5请求 - 更改数据

它建议重写表单请求上的方法,以包含用于在验证之前操作数据的逻辑。all

<?php namespace App\Http\Requests;

class UpdateSettingsRequest extends Request {

    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [];
    }

    public function all()
    {
        $data = parent::all();
        $data['date_of_birth'] = 'test';
        return $data;
    }

这对于验证来说很好,但重写该方法实际上并不会修改表单请求对象上的数据。因此,在执行命令时,表单请求包含原始的未修改数据。除非我使用现在被覆盖的方法将数据拉出。allall

我正在寻找一种更具体的方式来修改我的表单请求中的数据,不需要调用特定方法。

干杯


答案 1

在laravel 5.1中,你可以做到这一点

<?php namespace App\Http\Requests;

class UpdateSettingsRequest extends Request {

public function authorize()
{
    return true;
}

public function rules()
{
    return [];
}

protected function getValidatorInstance()
{
    $data = $this->all();
    $data['date_of_birth'] = 'test';
    $this->getInputSource()->replace($data);

    /*modify data before send to validator*/

    return parent::getValidatorInstance();
}

答案 2

从Laravel 5.4开始,您可以在FormRequest类上使用该方法。prepareForValidation

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'title' => 'required|max:200',
            'body' => 'required',
            'tags' => 'required|array|max:10',
            'is_published' => 'required|boolean',
            'author_name' => 'required',
        ];
    }

    /**
     * Prepare the data for validation.
     *
     * @return void
     */
    protected function prepareForValidation()
    {
        $this->merge([
            'title' => fix_typos($this->title),
            'body' => filter_malicious_content($this->body),
            'tags' => convert_comma_separated_values_to_array($this->tags),
            'is_published' => (bool) $this->is_published,
        ]);
    }
}

这里有一个更详细的文章:https://sampo.co.uk/blog/manipulating-request-data-before-performing-validation-in-laravel


推荐