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

sid*_*diq 0 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') ) );
Run Code Online (Sandbox Code Playgroud)

这是我试过的.但这不起作用.如果我将to_date作为空值,它将通过错误.

Dut*_*IFF 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
  ]
];
Run Code Online (Sandbox Code Playgroud)

现在让我们创建一个新的请求php artisan make:request StoreWhateverRequest.这将创建App/HTTP/Request/StoreWhateverRequest.php文件.打开它并将规则放在rules()函数的返回数组中.

return [
   'from_date'       => 'date',
   'to_date'         => 'date|after_field:from_date'
 ];
Run Code Online (Sandbox Code Playgroud)

这还不行,因为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]]);
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面我们有:$attribute我们正在检查的字段的名称(to_date),$value是我们正在检查的字段的值,$parameters是我们传递给Validator(from_date)的参数'to_date' => 'date|afterField:from_date'.我们还需要传递给Validator的其他数据字段,我们可以使用它们$this->data.然后我们必须适当地预先形成逻辑.你真的不需要碳,但一定要解析字符串,所以我们不做字符串比较.

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

Validator::resolver(function($translator, $data, $rules, $messages)
{
  return new afterFieldValidator($translator, $data, $rules, $messages);
});
Run Code Online (Sandbox Code Playgroud)

最后一步是最简单的.只需注入和实例StoreWhateverRequest到我们的控制器.

...
public function store(StoreWhateverRequest $request)
{
...
Run Code Online (Sandbox Code Playgroud)

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

  • 现在,Laravel 5接受将字段名称传递给`before`和`after`验证器.在这种情况下,只需使用`after:from_date` (2认同)

Cri*_*hel 6

我知道这是关于 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);
Run Code Online (Sandbox Code Playgroud)


小智 5

请在laravel 5.2中使用以下代码,它可以很好地验证开始日期和结束日期。

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

        ]); 
Run Code Online (Sandbox Code Playgroud)