Laravel在表单请求类中更改请求数据

时间:2017-01-06 05:46:06

标签: php laravel laravel-5

我正在处理一个多日期输入的表格,该表格不在A.D中。为了验证目的,我使用表格请求。

在验证并插入我的数据库之前,日期输入必须转换为A.D,这样我才能进行正确的验证。然后,如果验证成功,则日期输入存储在A.D。

这是我在A.D

中转换日期输入的代码
<?php

abstract class Request extends FormRequest
{
    public function all()
    {

       $input = parent::all()

       foreach ($input as $key=>$value)
       {
            if (substr($key, -5) == "_date")
            {
                $input[$key] = Helper::convert_in_ad($value);
            }
       }
       return $input;
    }
}

现在问题是假设您验证失败并重定向回上一个操作,然后您使用old()或其他方法从会话访问请求数据,它将被修改,我无法得到原始数据。

如何在验证之前更改A.D中的日期输入,以便我可以在A.D中正确验证,然后通过解决已修改输入的失败验证问题将所有日期输入存储在A.D.中。

编辑问题

更新

<?php

namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use App\Repositories\Contracts\CourseInterface;
use App\Repositories\Contracts\ClassInterface;


use App\Http\Requests\ClassRequest;
use App\Helpers\Helper;

class ClassController extends Controller
{

    public function __construct(ClassInterface $class, CourseInterface $course)
    {
        $this->class = $class;
        $this->course = $course;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $classes = $this->class->paginate();

        return view('backend.class.index')->with([
            'classes' => $classes
        ]);

        /*return view('backend.class.index')->with([
            'classes' => $classes
        ]);*/
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        $courses = $this->course->all();

        return view('backend.class.create')->with([
            'courses' => $courses
        ]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(ClassRequest $request)
    {

      //  dd($request->all());

        $this->class->create($request->all());

        return redirect()->route('classes.index');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $class = $this->class->find($id);
        $courses = $this->course->all();

        return view('backend.class.edit')->with([
            'class' => $class,
            'courses' => $courses
        ]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(ClassRequest $request, $id)
    {
        $class = $this->class->update($request->all(), $id);

        return redirect()->back();
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $this->class->delete($id);

        return redirect()->route('classes.index');
    }

    public function delete($id)
    {
        $class = $this->class->find($id);

        return view('backend.class.delete')->with([
            'class' => $class
        ]);
    }
}

我的班级申请档案

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;
use App\Helpers\Helper;

class ClassRequest extends Request
{

public function all()
{
    $input = parent::all();

    foreach ($input as $key=>$value)
    {
        if (substr($key, -5) == "_date")
        {
            $input[$key] = Helper::convert_in_ad($value);
        }
    }
    return $input;
}

/**
 * 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()
{

    //$this->sanitize();

    switch($this->method())
    {
        case 'GET':
        case 'DELETE':
        {
            return [];
        }
        case 'POST':
        {
            return [
                'name'          => 'required',
                'course_id'     => 'required',
                'start_date'    => 'required|date',
                'end_date'      => 'date|after:start_date',
            ];
        }
        case 'PUT':
        case 'PATCH':
        {
            return [
                'name'          => 'required',
                'course_id'     => 'required',
                'start_date'    => 'required|date',
                'end_date'      => 'date|after:start_date',
            ];
        }
        default:break;
    }
}

}

出于验证目的,我需要在A.D中更改B.S的日期,因为laraval验证不会识别B.S日期。如果我在请求文件中转换日期,问题是如果验证失败,我会在重定向后将表单中的修改后的请求恢复。

那么如何通过将日期转换为A.D来验证日期。数据库表中的日期必须以A.D格式存储,因为我可以使用Accessors和Mutators,主要问题是如何验证用户以B.S格式输入的数据。

编辑完成建议后

谢谢大家的建议,非常感谢你的帮助。我可以验证的一种方法是按照建议制作自定义验证规则。现在我有另一个想法让这项工作。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Helpers\Helper;

abstract class Request extends FormRequest
{
/**
 * Sanitize input before validation
 * 
 * @return array
 */
public function validator($factory)
{
    return $factory->make(
        $this->sanitizeInput(), $this->container->call([$this, 'rules']), $this->messages()
    );
}

protected function sanitizeInput()
{
    if (method_exists($this, 'sanitize'))
    {
        return $this->container->call([$this, 'sanitize']);
    }

    return $this->all();
}

/**
 * Check for input having _date for converting it into AD
 * 
 * @return array
 */

public function sanitize()
{
    $input = $this->all();

    foreach ($input as $key=>$value)
    {
        if (substr($key, -5) == "_date")
        {
            $input[$key] = Helper::convert_in_ad($value);
        }
    }

    return $input;
}


}

通过使用以下代码请求数据不会更改。并且不需要创建自定义验证,如果我后来决定从用户那里获取A.D的日期然后更改每个请求文件以更新验证规则,这将很容易。

您如何看待这个?

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,您应该尝试避免编辑FormRequest中的数据。

您可以做的是专门为此定义新的验证规则:https://laravel.com/docs/5.3/validation#custom-validation-rules

因此,在您的app/Providers/AppServiceProvider(或其他已注册的ServiceProvider)中,您可以拥有以下内容:

Validator::extend('bs_date', function ($attribute, $value, $parameters, $validator) {

    $date = date_parse(Helper::convert_in_ad($value));

    return checkdate($date['month'], $date['day'], $date['year']);
}, 'Your error message');

Validator::extend('bs_after', function ($attribute, $value, $parameters, $validator) {

    $data = $validator->getData();

    $before = Helper::convert_in_ad($data[$parameters['0']]);

    $after = Helper::convert_in_ad($value);

    return (new \DateTime($before)) < (new \DateTime($after));
}, 'Your error message');

规则

'start_date'    => 'required|bs_date',
'end_date'      => 'date|bs_after:start_date',

显然,请勿忘记在Validator中导入HelperServiceProvider

这意味着您不再需要编辑输入。

希望这有帮助!