【发布时间】:2021-04-29 11:53:42
【问题描述】:
我正在使用 laravel-excel 包将 excel 文件导入到集合中。我正在尝试验证日期字段reporting_date,使其为after_or_equal 其他两个日期字段registered_date 和analysis_date。只有一个 after_or_equal 日期字段,所有这些都可以正常工作。我正在动态填充规则和自定义消息数组。规则应用正确,但我无法通过自定义消息覆盖默认消息以进行此特定验证,而是显示默认消息。
public function collection(Collection $rows)
{
$data = $rows->toArray();
$rules = [Some static rules defined];
$messages = [];
foreach ($data as $key => $val){
/*Adding [complex/]conditional rules and messages.*/
...
...
if(!empty($val['reporting_date'])){
$rules = array_merge($rules, [$key.'.reporting_date' => ['sometimes', 'nullable', 'date', 'after_or_equal:'.$key.'.registered_date,', 'after_or_equal:'.$key.'.analysis_date']]);
$messages["$key.reporting_date.date"] = "Error on row: <strong>".($key+2)."</strong>. The reporting_date <strong>".(Arr::exists($val, "reporting_date")?$val['reporting_date']:"").
"</strong> is not a valid date.";
/****These messages are not overriding the default message.****/
$messages["$key.reporting_date.after_or_equal.$key.registered_date"] = "Error on row: <strong>".($key+2)."</strong>. The reporting_date <strong>".(Arr::exists($val, "reporting_date")?$val['reporting_date']:"").
"</strong> must be a date after or equal to registered_date <strong>".(Arr::exists($val, "registered_date")?$val['registered_date']:"").
"</strong>.";
$messages["$key.reporting_date.after_or_equal.$key.analysis_date"] = "Error on row: <strong>".($key+2)."</strong>. The reporting_date <strong>".(Arr::exists($val, "reporting_date")?$val['reporting_date']:"").
"</strong> must be a date after or equal to analysis_date <strong>".(Arr::exists($val, "analysis_date")?$val['analysis_date']:"").
"</strong>.";
...
...
}
}
}
我收到的消息是
The 0.reporting_date must be a date after or equal to 0.registered_date.
The 0.reporting_date must be a date after or equal to 0.analysis_date.
验证规则:
"0.reporting_date" => array:5 [▼
0 => "sometimes"
1 => "nullable"
2 => "date"
3 => "after_or_equal:0.registered_date,"
4 => "after_or_equal:0.analysis_date"
]
我怀疑我没有将消息分配给正确的数组键,因此我没有看到自定义消息。现在它是这样分配的,我希望显示这条消息。
"0.reporting_date.after_or_equal.0.registered_date" => "Error on row: 2. The reporting_date 2020-09-08 must be a date after or equal to registered_date 2020-09-12."
"0.reporting_date.after_or_equal.0.analysis_date" => "Error on row: 2. The reporting_date 2020-09-08 must be a date after or equal to analysis_date 2020-09-14."
同样在调试错误信息。
dd($validator->errors());
0.reporting_date" => array:2 [▼
0 => "The 0.reporting_date must be a date after or equal to 0.registered_date."
1 => "The 0.reporting_date must be a date after or equal to 0.analysis_date."
]
【问题讨论】:
-
验证时,通常,第一个错误你会被重定向回来。为避免这种情况,您可以将验证机制拆分为 2 个或更多阶段。不确定你得到这个,但你可以做类似的事情:validate->this。然后验证-> 那....然后保存/更新东西。
标签: php laravel validation laravel-excel