我有一个表单,用户可以同时插入许多纪录。每个纪录都会有一个“id”,一个“开始日期”和一个“结束日期”。为了处理输入数据,我正在寻找验证所有这些内容的最佳方式。
我尝试扩展Laravel验证,但我甚至无法接近我想要的效果……
我尝试过的: app/services/validators/LearningPathValidator.php(我正在使用laravel-extended-validator)
我的模型使用
实际上,我无法要求至少有一条记录,正如我之前所说,我也无法保证结束日期早于开始日期。有没有关于如何重写我的代码的建议?提前感谢您!
- 我将要求至少有一项记录
- 对于每个输入的记录,“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]
作为字段名称。实际上,我无法要求至少有一条记录,正如我之前所说,我也无法保证结束日期早于开始日期。有没有关于如何重写我的代码的建议?提前感谢您!