2014-01-09 98 views
4

我有一个用户将一次插入许多记录的表单。每个记录将具有ID开始日期结束日期。要处理输入数据,我正在寻找最佳方法来验证所有这些事情。Laravel:自定义多维数组验证

  • 我得需要至少一个记录
  • 对于每个inputed记录,ID应该存在于另一个表,日期开始结束日期应该是有效的日期和结束日期应该比开始日期

所以我需要某种这里多维数组验证的旧于...有没有自定义验证插件/代码已经编码?

我试图扩大Laravel验证,但我无法得到甚至接近想什么,我......

我已经试过:

应用程序/服务/验证/ LearningPathValidator.php(我使用laravel扩展验证器

<?php 

use Crhayes\Validation\ContextualValidator; 

class LearningPathValidator extends ContextualValidator 
{ 
    protected $rules = [ 
     'default' => [ 
      'name' => 'required|max:96', 
      'courses' => 'required|multi_array:course_id=required;exists:courses,date_start=required;date_format:d/m/Y,date_end=required;date_format:d/m/Y' 
     ], 
    ]; 
} 

应用程序/ validations.php(在这里,我延伸照亮\确认\验证类)

<?php 

class AppValidator extends Illuminate\Validation\Validator 
{ 
    protected function validateMultiArray($attribute, $value, $parameters) 
    { 
     if (!is_array($value)) { 
      return false; 
     } 

     foreach ($parameters as $parameter) { 
      list($_attribute, $rules) = $this->parseRule(
       str_replace(['=', ';'], [':', ','], $parameter)); 

      foreach ($rules as $rule) { 
       foreach (array_keys(Input::get($attribute)) as $idx){ 
        $this->validate(sprintf('%s.%d.%s', $attribute, $idx, 
         snake_case($_attribute)), $rule); 
       } 
      } 
     } 

     return count($this->messages->all()) === 0; 
    } 
} 

开始/ global.php:(这里我向照亮\确认\验证AppValidator

// ... 

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

// ... 

我的模型正在使用courses[$index][course_id]courses[$index][date_start]courses[$index][date_end]作为字段名称。

其实正如我以前说过,我不能要求至少一个记录,我不能保证结束日期会比开始日期老。有什么建议来重写我编码的内容?先谢谢你!

+0

这是来自论坛的东西,声称工作http://forumsarchive.laravel.io/viewtopic.php?pid=31171 – Mei

+0

很高兴你考虑使用AJAX为了在当时只有一个请求? – clod986

回答

0

结束日期要早于开始日期

我不知道如何实现最后的条件不延长laravel验证。但是如果您使用的是Laravel 5.2,则有一个新的array validator。 这将帮助你做到:

protected $rules = [ 
    'courses.*.id' => 'required|exists:courses', 
    'courses.*.date_start' => 'required|date_format:d/m/Y', 
    'courses.*.date_end' => 'required|date_format:d/m/Y', 
]; 

这执行您请求的前三个条件。检查结束日期是否比开始日期早的最后一个可能是您在函数中必须执行的操作。

注意:我假设规则date_format:d/m/Y是您验证日期的首选方式。