Laravel 4:验证验证前后的开始和结束日期

时间:2014-11-08 12:17:59

标签: php validation date laravel

我想验证from_date和end_date形式的两个日期字段。需要检查from_date是否小于end_date。

$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作为空值,它将通过错误。

5 个答案:

答案 0 :(得分: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'中的Validator(from_date)的参数。我们还需要传递给Validator的其他数据字段,我们可以使用$this->data获取这些数据字段。然后我们必须适当地预先形成逻辑。你真的不需要碳,但一定要解析字符串,所以我们不做字符串比较。

现在我们需要将其加载到应用程序中。为此,请将以下代码放在boot()中的app/Providers/AppServiceProviders.php函数中。

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

最后一步是最简单的。只需将StoreWhateverRequest注入到我们的控制器中即可。

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

全部完成。我觉得这是解决问题的一种非常实用的方法。

答案 1 :(得分:5)

请使用laravel 5.2中的以下代码,它可以用于验证开始和结束日期。

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

        ]); 

答案 2 :(得分:4)

我知道这是一个关于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);

答案 3 :(得分:3)

刚刚遇到这个并认为我分享了一个我找到的答案:Compare attributes in validation

基本上,您创建了一个新的Validator,它扩展了Illuminate \ Validation \ Validator并在那里编写了一个自定义规则:

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',
]

答案 4 :(得分: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())
{ ... }

这可能不是我问的答案。但我只需要一种方法来完成这个。可能对别人有帮助。