2016-02-06 77 views
0

有没有办法在验证发生之前修改表单请求类中的输入字段?Laravel 5.1在表单请求验证之前修改输入

我想修改一些输入日期字段如下,但它似乎并没有工作。

当我设置$this->start_dt输入字段为2016-02-06 12:00:00$this->end_dt2016-02-06 13:00:00我仍然收到验证错误“end_dt必须在start_dt之后”。这意味着当您在rules()函数内更新$this->start_dt$this->end_dt时,输入请求值不会发生变化。

public function rules() 
{ 
    if ($this->start_dt){ 
     $this->start_dt = Carbon::createFromFormat('d M Y H:i:s', $this->start_dt . ' ' . $this->start_hr . ':'. $this->start_min . ':00'); 
    } 

    if ($this->end_dt){ 
     $this->end_dt = Carbon::createFromFormat('d M Y H:i:s', $this->end_dt . ' ' . $this->end_hr . ':'. $this->end_min . ':00'); 
    } 

    return [ 
     'start_dt' => 'required|date|after:yesterday', 
     'end_dt' => 'required|date|after:start_dt|before:' . Carbon::parse($this->start_dt)->addDays(30)    
    ]; 
} 

注:start_dtend_dt的日期选择器字段和start_hrstart_min是下拉领域。因此,我需要通过组合所有字段来创建日期时间,以便我可以进行比较。

回答

0

你可以做类似如下:

public function rules(Request $request) 
{ 
    if ($request->has('start_dt')){ 
     $request->replace('start_dt', Carbon::createFromFormat('d M Y H:i:s', $request->start_dt . ' ' . $request->start_hr . ':'. $request->start_min . ':00')); 
    } 

    if ($request->has('end_dt')){ 
     $request->replace('end_dt' ,Carbon::createFromFormat('d M Y H:i:s', $request->end_dt . ' ' . $request->end_hr . ':'. $request->end_min . ':00')); 
    } 

    return [ 
     'start_dt' => 'required|date|after:yesterday', 
     'end_dt' => 'required|date|after:start_dt|before:' . Carbon::parse($request->start_dt)->addDays(30)    
    ]; 
} 
7

由于laravel 5.4的可以覆盖ValidatesWhenResolvedTraitprepareForValidation方法来修改任何输入。对于laravel 5.1应该有类似的东西。

例在请求

/** 
* Modify the input values 
* 
* @return void 
*/ 
protected function prepareForValidation() { 

    // get the input 
    $input = array_map('trim', $this->all()); 

    // check newsletter 
    if (!isset($input['newsletter'])) { 
     $input['newsletter'] = false; 
    } 

    // replace old input with new input 
    $this->replace($input); 
} 
+0

这个荣誉。确认在L5.4上工作。 Upped +1 –

+0

为我工作,非常感谢! – FabulousCo

+0

这是记录在任何地方吗?否则,它可能会像以前的其他解决方案一样,在一个小版本升级中悄然破碎 – Enkay

1

的FormRequest有返回验证数据的方法validationData(),所以我重写它在我的形式要求:

<?php 

namespace App\Http\Requests; 

use Illuminate\Foundation\Http\FormRequest; 

class MyClassRequest extends FormRequest 
{ 
    ... 
    /** 
    * Get data to be validated from the request. 
    * 
    * @return array 
    */ 
    public function validationData() { 
     return array_merge(
      $this->all(), 
      [ 
       'number' => preg_replace("/[^0-9]/", "", $this->number) 
      ] 
     ); 
    } 
    ... 
} 

它工作正常我使用Laravel 5.4 :)

+0

在laravel 5.4上不起作用5.4 – FabulousCo

+0

嗨FabulousCo,你能告诉我你的FormRequest和控制器方法吗? –

+0

嗨亚辛,托马斯虽然工作的例子!不管怎么说,还是要谢谢你 :) – FabulousCo