Laravel ошибка валидатора для фильтра массива параметров запроса [id] = 1 - PullRequest
1 голос
/ 26 апреля 2020

У меня есть проблема с проверкой параметров запроса для фильтрации записей, полученных в строке запроса

   $validator = Validator::make($request->request->all(), [
            'filter' =>
                [
                 'array',
                 Rule::in(implode(',',$columns))
                ],
            'page' =>'integer'
        ]);

Где кулмны включают идентификатор, имя, размер и т. Д. c. и запрос API имеет следующий формат

./findAll?filter[id]=1&filter[name]=test

Я хочу вернуть ответ 400, когда пропущен любой фильтр, который не существует в виде столбца.

1 Ответ

1 голос
/ 26 апреля 2020

Вы можете использовать расширение Validator для создания собственного валидатора:

В AppServiceProvider введите этот код: (или в любом провайдере)

public function boot(){
  Validator::extend('keys_in', function ($attribute, $value, $arr, $validator) {
      if (!is_array($value)) return false;

      foreach (array_keys($value) as $key) {
          if (!in_array($key, $arr)) return false;
      }

      return true;
  });

  Validator::extend('keys_in_columns', function ($attribute, $value, $table, $validator) {
      if (!is_array($value)) return false;

      $columns = Schema::getColumnListing($table);

      foreach (array_keys($value) as $key) {
          if (!in_array($key, $columns)) return false;
      }

      return true;
  });
}

Пользовательский validator Closure получает четыре аргумента: имя проверяемого атрибута $, значение атрибута $, массив параметров, передаваемых правилу, и экземпляр Validator.

Затем в любом контроллере Вы можете использовать эти два правила:

$validator = Validator::make($request->request->all(), [
    'filter' =>['array','keys_in:' . implode(',',$columns)],
    'page' =>'integer'
]);

Или использовать ярлык keys_in_columns, который я определил выше:

$validator = Validator::make($request->request->all(), [
    'filter' =>['array','keys_in_columns:users'],
    'page' =>'integer'
]);

Не забудьте использовать use Illuminate\Support\Facades\Schema; и use Illuminate\Support\Facades\Validator; у поставщика услуг

Надеюсь, это вам поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...