Laravel 5 Form请求数据预处理

Jon*_*hon 27 php validation laravel laravel-5

我正在处理一个表格,用户可以更新他们的出生日期.的形式给出用户3的单独字段day,monthyear.当然,在服务器端,我想将这3个独立的字段视为一个值即yyyy-mm-dd.

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

使用我的控制器手动实现此功能不是问题.我可以简单地抓取输入,将字段连接在一起,-然后取消设置.然后,我可以在传递给处理命令之前手动验证.

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

我确实找到了类似的以下问题:Laravel 5 Request - 改变数据

它建议覆盖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;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

干杯

Jul*_*ova 35

在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();
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*hon 9

在我自己搞砸了之后,我想出了以下内容:

应用程序/ HTTP /请求/ Request.php

<?php namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

abstract class Request extends FormRequest {

    /**
    * Override the initialize method called from the constructor to give subclasses
    * an opportunity to modify the input before anything happens.
    *
    * @param array $query
    * @param array $request
    * @param array $attributes
    * @param array $cookies
    * @param array $files
    * @param array $server
    * @param null $content
    */
    public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
    {
        parent::initialize($query, $request, $attributes, $cookies, $files, $server, $content);

        // Grab the input
        $data = $this->getInputSource()->all();
        // Pass it off to modifyInput function
        $data = $this->modifyInput($data);
        // Replace modified data back into input.
        $this->getInputSource()->replace($data);
    }


    /**
    * Function that can be overridden to manipulate the input data before anything
    * happens with it.
    *
    * @param array $data The original data.
    * @return array The new modified data.
    */
    public function modifyInput(array $data)
    {
        return $data;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在扩展类时,您可以modifyInput像这样重写方法:

应用程序/ HTTP /请求/ TestRequest.php

<?php namespace App\Http\Requests;

class TestRequest extends Request {

    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [];
    }

    /**
     * Modify the input.
     */
    public function modifyInput(array $data)
    {
        $data['date_of_birth'] = 'something';

        // Make sure to return it.
        return $data;
    }

}
Run Code Online (Sandbox Code Playgroud)

这似乎适合我的需要.我不确定这样做的任何缺点所以我欢迎任何评论/批评.

上面的Shift Exchange给出的答案也可以正常工作.


小智 9

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

<?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,
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

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