我添加了自定义验证规则
Validator::extend('validate_timezone', function($attribute, $value, $parameters, $validator) {
$items = request('items');
$from_date = Carbon::createFromFormat('Y-m-d H:i:s', $item['from_date']);
// my code below depend on $from_date
......
......
return true;
);
验证规则
"from_date" => "required|date_format:Y-m-d H:i:s|validate_timezone",
自定义验证validate_timezone
的问题在'date_format:Y-m-d H:i:s'
之前运行,因此,如果日期格式错误,我将在validate_timezone
函数内部出现错误
如何在自定义验证date_format:Y-m-d H:i:s
之前强制验证validate_timezone
?
答案 0 :(得分:1)
在documentation中可以找到以下内容:
规则将按照分配的顺序进行验证。
意思是代码按预期工作。
您可能正在寻找bail
选项:
有时,您可能希望在第一次验证失败后停止对属性运行验证规则。为此,请将
bail
规则分配给属性
这意味着您应该尝试以下操作:
"from_date" => "bail|required|date_format:Y-m-d H:i:s|validate_timezone",
答案 1 :(得分:0)
自定义扩展验证规则首先运行,因为它可能是在针对每个请求运行的服务提供商的启动功能中定义的,因此您需要捕获Carbon异常并相应地返回false
public function boot()
{
\Validator::extend('validate_timezone', function ($attribute, $value, $parameters, $validator) {
try {
$from_date = Carbon::createFromFormat('Y-m-d H:i:s', $value);
return true;
} catch (Exception $ex) {
logger()->warning($ex->getMessage());
return false;
}
});
}
现在,如果碳无法按照所传递的格式创建,它将抛出一个异常,我们捕获,记录并返回false
正如@PtrTon所述,您需要在首次验证失败时保释
现在假设这样的验证逻辑
Route::post('/', function () {
$validate = request()->validate([
"from_date" => "bail|required|date_format:Y-m-d H:i:s|validate_timezone",
]);
dd($validate);
});
还有这样的视图形式
<form action="/" method="post">
@csrf
<input type="datetime" name="from_date" value="2019-10-16 15:03">
<button type="submit">Submit</button>
</form>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
date_from
的值对date_format
和validate_timezone
均无效,但只会返回date_format
的验证错误消息
希望这会有所帮助