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

10 просмотров

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

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

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

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

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

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann Chapmann
19
Так а кто может спарсить всех участников чата? Идишники
Magic
18
а как ловят такое ghci> res <- getPos2 urlt 0 (alist !! 0) 200 ghci> res SearchAtom (Search "www.google.com" "/search?q=" "Haskell") "haskell.org" (SearchTS [(2024-05-06 07:...
Fedor
14
Есть вопрос: допустим есть железка с каким-то интерфейсом(допустим usb), но как по этому интерфейсу железкой управлять неизвестно, прог нету, а управлять очень хочется надо. К...
Mixail Frolov
15
Карта сайта