Сначала запускается пользовательское расширенное правило проверки, потому что оно, вероятно, определено в функции загрузки поставщика услуг, который запускается при каждом запросе, поэтому вам нужно перехватить исключение 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;
}
});
}
Теперь, если carbon не может создать из переданного формата, он сгенерирует исключение, которое мы перехватываем, регистрируем и возвращаем false
И, как упомянуто @ PtrTon , вам нужно поручиться при первой проверкеfail
Теперь предполагается, что логика проверки выглядит следующим образом:
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
Надеюсь, это поможет