【问题标题】:Laravel 4: Validate start and end date with before and after validationLaravel 4:在验证之前和之后验证开始和结束日期
【发布时间】:2015-01-05 04:15:37
【问题描述】:

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

【问题讨论】:

    标签: php validation date laravel


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        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 是我们传递给验证器的参数(from_date)见于'to_date' =&gt; 'date|afterField:from_date'。我们还需要传递给验证器的其他数据字段,我们可以通过$this-&gt;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)
        {
        ...
        

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

        【讨论】:

        • 现在 Laravel 5 接受将字段名称传递给 beforeafter 验证器。在这种情况下,只需使用after:from_date
        【解决方案4】:

        刚遇到这个,我想分享一个我找到的答案:Compare attributes in validation

        基本上,您将创建一个扩展 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',
        ]
        

        【讨论】:

          【解决方案5】:

          不管怎样,

          我就是这样做的。这样即使表单中的任何日期为空,也会自动填写并检查验证

          $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())
          { ... }
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-12-31
            • 2022-01-06
            • 1970-01-01
            • 1970-01-01
            • 2015-09-29
            • 1970-01-01
            • 2020-05-27
            相关资源
            最近更新 更多