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 ответов

76 просмотров

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

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, а значит нет смысла валидировать в форм реквестах.... вот и получается, что это часть фреймворка просто отбрасывается при таком варианте...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
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
Карта сайта