169 похожих чатов

Привет! Есть задача валидировать вложенные объеты, пытаюсь разобраться, как это корректно

сделать.

Допустим, имеем запрос вида:
{
"task": {
...
"owner": {
"id": 1231233,
"name": "Mark"
},
"field123": 123,
"field122": 124,
"responsible": {
"id": 1231,
"name": "Joe"
},
...
}
}

Сейчас правила для валидатора выглядят вот так:
public function rules(): array
{
return [
...
"task.owner.id" => 'numeric',
"task.owner.name" => 'string',
"task.responsible.id" => 'numeric',
"task.responsible.name" => 'string',
...
];
}

А по ощущениям, хочется что-то такое
public function rules(): array
{
return [
...
"task.owner" => new Rule([
"id" => "numeric",
"name" => "string"
]),
"task.responsible" => new Rule([
"id" => "numeric",
"name" => "string"
]),
...
];
}

С последующими наследованиями и тд.
Есть ли базовый функционал, который в такое умеет? Как такое правильно сделать?

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

20 ответов

48 просмотров

О наследованиях в классах валидации забудь вообще)

leolnid- Автор вопроса
Василий 🇺🇦❤️
О наследованиях в классах валидации забудь вообще)

Я в них все еще верю.. Чуть чуть Потому что писать для сложных объектов полотна дублирующее - какая то шляпа

leolnid
Я в них все еще верю.. Чуть чуть Потому что писать...

Зря веришь, наследовать форм реквесты низя. Если проект будет расти, будет много чего расширяться, и в один момент начнутся проблемы с валидациями:)

Что по поводу ощущений, так они ошибочны, когда пишешь task.owner.id - это называется точечная нотация, и она удобна

leolnid- Автор вопроса
Василий 🇺🇦❤️
Что по поводу ощущений, так они ошибочны, когда пи...

Я понимаю, что такое точечная нотация Но проблема в том, что таких объектов может быть ОЧЕНЬ много. Сейчас типичное правило для валидации расползается на 100-150 строк с кучей дублей. Глобальная цель - решить дублирование.

В точечной нотации можно ставить * как символ прохода по массиву Может нужно поставить так логику, чтобы было много tasks.*.owner.id

leolnid- Автор вопроса
Василий 🇺🇦❤️
В точечной нотации можно ставить * как символ прох...

Внешнее апи, которое отправляет запросы. Там идут вперемешку, в зависимости от названия поля разные объекты. И пользователи, и проекты, и ссылки и тд. Тут момент, что нужно именно кастомные блоки валидации вот такие.

leolnid
Внешнее апи, которое отправляет запросы. Там идут ...

Рекомендовал бы у себя переписать как нужно, с помощью одного пакета дто https://github.com/WendellAdriel/laravel-validated-dto Передаешь сколько хочешь параметров, и в методе mapBeforeValidation пишешь свои имена

leolnid- Автор вопроса
Василий 🇺🇦❤️
Рекомендовал бы у себя переписать как нужно, с пом...

Прикольный пакет, возьму на заметку) А как вы рекомендуете переписать такое? Когда приходит task с кучей полей внутри, тип которых зависит от имени? Сразу совать в пакет без валидации на уровне запроса?

leolnid
Прикольный пакет, возьму на заметку) А как вы рек...

https://github.com/WendellAdriel/laravel-validated-dto#mapping-data-before-validation

leolnid- Автор вопроса
Василий 🇺🇦❤️
https://github.com/WendellAdriel/laravel-validated...

Я понимаю, как работает маппинг перед валидацией) Я имею в виду, что мы забиваем на валидацию запросов нативную и просто уходим в валидацию на уровне dto, правильно идею понял?

leolnid
Я понимаю, как работает маппинг перед валидацией) ...

как спрашивал здесь - можно забить на make:request, но в начале метода контроллера create/update весь $request кидать сразу в дто

Василий 🇺🇦❤️
как спрашивал здесь - можно забить на make:request...

то есть реквест в реквест классах уже не валидируется, а валидируется только внутри дто?

Василий 🇺🇦❤️
Валидируется, но зачем тебе валидация в двух места...

ну я об этом и говорю получается, просто выкидывается часть фреймворка

Дмитрий Кондрашов
ну я об этом и говорю получается, просто выкидывае...

Ну тут удобность в плане прослойки дто, IDE ведь даёт подсказки при написании стрелочки Ты можешь в rules() класса дто, поставить всем атрибутам пустую строку, и делать валидацию на уровне форм реквестов

Дмитрий Кондрашов
ну я об этом и говорю получается, просто выкидывае...

А так-то часть не выкидывается, а просто используется в другом месте

Василий 🇺🇦❤️
Ну тут удобность в плане прослойки дто, IDE ведь ...

э....вот тут я не совсем понял) речь о конкретном пакете для dto и пхп шторме?) я то говорил в целом о примении дто в ларавель по идее это нужно тогда, когда запрос может прийти не только из http, а значит нет смысла валидировать в форм реквестах.... вот и получается, что это часть фреймворка просто отбрасывается при таком варианте...

Это нужно тогда, когда запрос может прийти из реквеста, или артисан команды, или ещё откуда-то И уйти тоже куда там нужно Дто хранит определённый не изменяемый набор свойств, которые вызываешь в нужном местк

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта