2014-11-08 100 views
0

我想驗證from_date和end_date格式的兩個日期字段。需要檢查from_date是否小於end_date。Laravel 4:在驗證前後驗證開始日期和結束日期

$rules = array('from_date' => array('sometimes','date_format:"Y-m-d"', 'before:'.Input::get('to_date')), 
         'to_date' => array('sometimes','date_format:"Y-m-d"', 'after:'.Input::get('from_date'))); 

這就是我試過的。但那不行。如果我將to_date作爲空值,它會通過錯誤。

回答

2

總之,

我這樣做。因此,即使在形式的任何日期爲空時會自動填充和檢查驗證

$inputs = Input::all(); 
if(!empty($inputs)) 
{ 
    $default_date_arr = array('from_date' => date('Y-m-d', strtotime('-1 days')), 'to_date' => date('Y-m-d')); 
    $inputs = $inputs+$default_date_arr; 
} 
$rules = array('from_date' => array('sometimes','date_format:"Y-m-d"', 'before:'.$to_date) , 
         'to_date' => array('sometimes','date_format:"Y-m-d"', 'after:'.$from_date)); 
$validator = Validator::make($inputs,$rules); 
if($validator->fails()) 
{ ... } 

這可能不是答案我問。但我需要一種方式來完成這一點。可能會對其他人有幫助。

2

過這個剛剛來到,我想我會分享一個答案,我發現:Compare attributes in validation

基本上,你會在那裏創建一個擴展照亮\確認\驗證了新的驗證和編寫自定義規則:

public function validateEndAfter($attribute, $value, $parameters) { 
    $start_date = $this->getValue($parameters[0]); // get the value of the parameter (start_date) 
    return (strtotime($value) > strtotime($start_date)); 
} 

然後在您的驗證使用新的規則:

$rules = [ 
    'start_date' => 'required', 
    'end_date'=> 'required|end_after:start_date', 
] 
6

Laravel 5:

下面是更廣泛的方法,遵循現代原則,更像Laravel。這有點複雜,但仍然容易遵循,最終結果更清晰。

讓我們從改變一些事情開始。讓我們減少這個問題,使用更新的數組語法並應用格式。

$rules = [ 
    'from_date' => [ 
    'before:'.Input::get('to_date') // This is what we will learn to do 
    ], 
    'to_date' => [ 
    'after:'.Input::get('from_date') // Do this one on your own 
    ] 
]; 

現在讓我們創建一個新的請求php artisan make:request StoreWhateverRequest。這將創建App/HTTP/Request/StoreWhateverRequest.php文件。打開它並將你的規則放在rules()函數的返回數組中。

return [ 
    'from_date'  => 'date', 
    'to_date'   => 'date|after_field:from_date' 
]; 

因爲after_field不提供給尚未使用這將無法工作。我們來創建它。我們需要一個擴展驗證器的新類。你可以把它放在app/Services。我們需要類似的東西:

<?php namespace App\Services; 

use Illuminate\Validation\Validator; 
use Carbon\Carbon; 

class AfterFieldValidator extends Validator { 
    public function validateAfterField($attribute, $value, $parameters) 
    { 
    return Carbon::parse($value) > Carbon::parse($this->data[$parameters[0]]); 
    } 
} 

在上面我們有:$attribute這是我們正在檢查(TO_DATE)的字段的名稱,$value是我們正在檢查和$parameters字段的值是參數我們傳遞給'to_date' => 'date|afterField:from_date'中的驗證器(from_date)。我們還需要將其他數據字段傳遞給Validator,我們可以使用$this->data來獲得這些數據字段。那麼我們只需要適當地預先制定邏輯。在這裏你甚至不需要Carbon,但一定要解析這個字符串,這樣我們纔不會進行字符串比較。

現在我們需要將它加載到應用程序中。要做到這一點,請在app/Providers/AppServiceProviders.php中的boot()函數中使用下面的代碼。

Validator::resolver(function($translator, $data, $rules, $messages) 
{ 
    return new afterFieldValidator($translator, $data, $rules, $messages); 
}); 

最後一步是最簡單的。只需在我們的控制器中注入並實例化StoreWhateverRequest即可。

... 
public function store(StoreWhateverRequest $request) 
{ 
... 

全部完成。我覺得這是一個很好的解決問題的方法。

+2

現在Laravel 5接受字段名傳遞給'before'和'驗證器之後。在那種情況下,只需使用'after:from_date' – 2016-07-23 00:34:28

4

請使用laravel 5.2中的以下代碼,它對於驗證開始日期和結束日期很有效。

$this->validate($request, [ 
      'start_date' => 'required|before:end_date', 
      'end_date' => 'required', 

     ]); 
2

我知道這是一個關於Laravel 4的問題,但如果你正在使用Laravel 5.3,現在你可以使用類似:

$rules = array(

    'date_start' => 'required|date_format:Y-m-d|before_or_equal:date_end', 
    'date_end' => 'required|date_format:Y-m-d|after_or_equal:date_start' 

     ); 

    $validator = Validator::make($request->all(), $rules);