Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 03.08.2017 14:51:51

Валидация входящего json через встроянный валидатор

Версия laravel: 5.4.30
php: 7.1.6

Мне приходит json в таком формате:

{
  "name":"example04.org.",
  "kind":"master",
  "nameservers":[
     "ns01.example04.org.",
     "ns03.example04.org."
  ]
}

В данный момент валидация происходит так:

        if (!$request->isJson())
            throw new RequestIsNotJson();

        $rules = config('ApiValidation.Domain.Create.rules');
        $messages = config('ApiValidation.Domain.Create.messages');

        $this->validate($request, $rules, $messages);

Правила валидации:

            'rules' => [
                'name' => [
                    'required',
                    'string',
                    "regex:/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\.$/",
                    'max:255'
                ],
                'kind' => [
                    'required',
                    'string',
                    'in:Master,Native,Slave',
                ],
                'nameservers' => [
                    'required',
                    'array',
                    'min:2'
                ],
                'nameservers.*' => [
                    "regex:/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\.$/",
                ]
            ]

Необходимо проверить что нет лишних полей в корневом массиве. Т.е. на такой формат переданных данных:

{
  "name":"example04.org.",
  "kind":"master",
  "kindFake":"master",
  "nameservers":[
     "ns01.example04.org.",
     "ns03.example04.org."
  ]
}

Необходимо бросить исключение так как поле "kindFake" не разрешено.
Пробовал вариант:

'*' => [
'in_array:'=>'name,kind,nameservers'
]

Но он не сработал.

Какие ещё существуют варианты проверить на "лишние" переданные поля ?

Изменено little_devil (03.08.2017 14:53:02)

Не в сети

#2 03.08.2017 17:50:45

Re: Валидация входящего json через встроянный валидатор

Вообще, немного спорно, правильно ли проверять наличие лишних полей в валидаторе.
Ведь по сути - валидатор валидирует ровно то, что передал ему ты. А ты хочешь сделать так, чтобы валидатор говорил - а там лишнее.
Ну, странно, почему бы не отсекать лишнее заранее?
Я бы от Request отнаследовал свой класс и в нем выкидывал ValidationException при наличии лишнего (будет совсем здорово, если ты делаешь валидацию в самом реквесте, а не контроллере, это и есть laravel-way, на каждый апи-запрос (читай - action) - свой реквест с валидацией).
Соответственно в action контроллера ждал бы не ларавеловский Request, а своего наследника.

Либо писать свое правило валидации для валидатора, либо проверять такое в Request заранее.

Изменено covobo (04.08.2017 09:08:46)

Не в сети

#3 03.08.2017 20:12:02

Re: Валидация входящего json через встроянный валидатор

Спасибо, проверять в Request такое заранее оказалось действительно более удобно.

Не в сети

Подвал раздела