#php #laravel #validation
Вопрос:
У меня есть такой валидатор,
$validator = Validator::make($request->query(),
[
'size' => 'required|numeric|max:' . (100 * 1024 * 1024)
],
[
'size.required' => 'param size is required',
'size.numeric' => 'param size should be numberic',
'size.max' => 'param size is over size'
]);
и теперь я хочу проверить $validator
ошибку has size.required
$messages = $validator->errors();
if ($messages->has('size.required')) {
// do something...
} else if ($messages->has('size.numeric')) {
// do something...
}
Так есть ли способ это реализовать?
Спасибо за любую идею.
Комментарии:
1. Вы не можете этого сделать,
has
работает сsize
не сsize.rule
. Я могу только думать , что вы могли бы использоватьget
вместоhas
(илиfirst
, таким образом, вы получите первую ошибку только в том случае, если у вас несколько ошибок для одного и того же поля) и попытаться прочитать сообщение и на основе этого узнать, чтоrule
не передается. Почему ты хочешь это сделать ? Может быть, решение находится в другом месте.2. @matiaslauriti Большое спасибо. Я работаю над приложением API Laravel, поэтому я хочу ответить на другой код ошибки по
Validator
результату, например, если правилоsize.required
не пройдет, оно ответит json как{"error":30001,"message":"xxxxx"}
, а если правилоsize.numeric
не пройдет, оно ответит json как{"error":30002,"message":"xxxxx"}
. Есть ли лучший способ сделать это? Еще раз спасибо.3. я думаю, вы можете сделать так, если ($проверка->сбой()) { $сообщения = $проверка->>ошибки(); если ($сообщения->>>имеет(‘размер’)) { если ($сообщения->первый(‘размер’) == ‘требуется размер параметра’) { // сделайте что-нибудь… } иначе, если ($сообщения->первый(‘размер’) == ‘размер параметра должен быть числовым’) { // сделайте что-нибудь… } } обратный редирект::назад()->withInput()->>С ошибками($сообщения); }
Ответ №1:
Не очень хорошее решение, но вы можете проверить, содержит ли сообщение об ошибке ключевое слово:
use IlluminateSupportStr;
if( Str::contains($messages->first('size'), 'required')){
// do something..
}
Комментарии:
1. Как вы сказали, да, это не лучший способ реализации, но ЭТО решение. Я попробую, если действительно нет лучшего способа. В любом случае, большое спасибо.
Ответ №2:
Я думаю, что вы ищете failed
метод в Validation
классе
$sizeArray = [
'required' => '', //Required Validation Will Fail
'numeric' => 'string', //Numeric Validation will fail
'max' => (100 * 1024 * 1024 * 10),//max validation will fail
'success_one' => '1234',
'success_two' => 1234
];
$validator = Validator::make(
[
'size' => $sizeArray['numeric']
],
[
'size' => 'required|numeric|max:' . (100 * 1024 * 1024)
],
[
'size.required' => 'param size is required test manoj',
'size.numeric' => 'param size should be numberic',
'size.max' => 'param size is over size'
]
);
$validator->errors();//Don't Remove this line
$failedValidation = collect($validator->failed())->map(function ($parameterFailedRules, $parameter) {
return array_change_key_case($parameterFailedRules, CASE_LOWER);
});
if (Arr::has($failedValidation, 'size.required')) {
dd('required Validation Failed');
}else if(Arr::has($failedValidation, 'size.numeric')){
dd('numeric Validation Failed');
} else if (Arr::has($failedValidation, 'size.max')) {
dd('max Validation Failed');
}else{
dd('All Validation Passed');
}
Пожалуйста, измените входное значение size
, чтобы изменить сообщение об ошибке.
В настоящее время это будет показано .
«числовая Проверка Не Удалась»