Валидатор Laravel — Проверьте, содержит ли ключ ошибки?

#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 , чтобы изменить сообщение об ошибке.

В настоящее время это будет показано .

«числовая Проверка Не Удалась»