Laravel:自定义多维数组验证

4
我有一个表单,用户可以同时插入许多纪录。每个纪录都会有一个“id”,一个“开始日期”和一个“结束日期”。为了处理输入数据,我正在寻找验证所有这些内容的最佳方式。
  • 我将要求至少有一项记录
  • 对于每个输入的记录,“id”应该存在于另一个表中,“开始日期”和“结束日期”应该是有效的日期,“结束日期”应该比“开始日期”早
所以我需要某种形式的多维数组验证……是否已经编写了任何自定义验证插件/代码?
我尝试扩展Laravel验证,但我甚至无法接近我想要的效果……
我尝试过的: app/services/validators/LearningPathValidator.php(我正在使用laravel-extended-validator
<?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'
        ],
    ];
}

app/validations.php(这里我正在扩展Illuminate\Validation\Validator类)

<?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;
    }
}

我的 start/global.php 文件:(在这里我通过 AppValidator 扩展了 Illuminate\Validation\Validator

// ...

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]作为字段名称。
实际上,我无法要求至少有一条记录,正如我之前所说,我也无法保证结束日期早于开始日期。有没有关于如何重写我的代码的建议?提前感谢您!

这是来自论坛的一些内容,声称可以工作 http://forumsarchive.laravel.io/viewtopic.php?pid=31171 - Mei Gwilym
你是否考虑过使用AJAX以便一次只有一个请求? - clod986
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接