2014-11-08 126 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); 
相关问题