Создать правило, чтобы запрос содержал только определенные ключи - PullRequest
1 голос
/ 11 июля 2019

Я использую Lumen Framework, который использует Laravel Validation Я хотел создать Правило Validator, чтобы json Request-> input () содержал только определенные ключи в корне, такие как «domain» и «nameservers». Не больше и не меньше.

Пример передачи правила:

{
    "domain":"domain.tld",
    "nameservers":
        {...}
}

Пример, не передающий правило:

{
    "domain":"domain.tld",
    "nameservers":
        {...},
    "Hack":"executeSomething()"
}

Я пытался использовать несколько правил проверки по умолчанию для достижения этой цели, но безуспешно. Мой подход был теперь, чтобы поместить запрос в другой массив, как это $ checkInput ['input'] = $ request-> all (); чтобы валидатор проверял «корневые» ключи.

Теперь это мой подход:

создать валидатор

        $checkInput['input'] = $request->all();
        $validator = Validator::make($checkInput, [
            'input' => [
                'onlyContains:domain,nameservers'
            ],
        ]);

создание правила

        Validator::extend('onlyContains', function($attribute, $value, $parameters, $validator){

            $input = $validator->getData();
            $ok = 0;
            foreach ($parameters as $key => $value) {
                if (Arr::has($input, $attribute . '.' . $value)) {
                    $ok++;
                }
            }
            if (sizeof(Arr::get($input, $attribute)) - $ok > 0) {
                return false;
            }
            return true;
        });

Кажется, я получил желаемый результат, но я спрашиваю, возможно, есть более разумное решение для этого с правилами по умолчанию, предоставленными Laravel / Lumen.

1 Ответ

0 голосов
/ 11 июля 2019

Вы пытаетесь использовать черный список, блокирующий поля, которые не предназначены.Простой подход, который часто используется, состоит в том, чтобы только извлечь проверенный.Также вы пытаетесь сделать логику, которая идет вразрез с обычной логикой проверки, чтобы сделать это полем за раз.

Это также хорошее время, чтобы узнать о FormRequest и как вы можете получить эту логикув место, где это имеет больше смысла.

public function route(MyRequest $request) {
    $input = $request->validated();
}

При таком подходе вы будете иметь только проверенные поля в переменной $ input.В качестве дополнительного бонуса, этот подход сделает ваш код проще для других разработчиков Laravel.Пример запроса формы ниже.

public class MyRequest extends FormRequest
{
    public function rules()
    {
        return [
            'domain' => ['required', 'string'], 
            'nameservers' => ['required', 'array'], 
        ];
    }
}
...