Вы можете использовать расширение 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;
у поставщика услуг
Надеюсь, это вам поможет