Валидация сложной модели

x00xer

Новичок
Добрый день.

Возник вопрос, следующего характера:
В большинстве случаев слой валидации (выполненный в виде сервиса скажем) имеет определенный набор встроенных правил. И в большинстве своем эти правила достаточно примитивны, типа строка это или нет, адрес почты или нет и т.д. И почти всегда правила валидации применяются к одному аттрибуту.

Конечно в некоторых современных фреймворках иногда встречаются и более сложные правила валидации, с участием базы данных или зависимые от других правил к примеру, так же есть иногда возможность в правило передать, через параметры, доп. данные.

Но вот что я не могу понять, если рассмотреть на примере E-Commerce сайта, к примеру заказ (или по другому корзина): содержит в себе товары из разных категорий. И скажем у бизнеса есть необходимость правиле: корзина должна быть не меньше чем на определенную сумму, в том случае если выбрана доставка а не самостоятельный вынос товаров. Мало того, скажем, ограничение на сумму заказа должно учитывать из каких категорий товары. Пример абсолютно выдуманный, но то что хотелось им сказать, так это то, что эта доменная модель может иметь множество сложных бизнес правил валидации.

Т.е. тут очевидно не просто правило валидации, применяемое к одному какому-то аттрибуту. Тут необходимо провалидировать целиком корзину как некую сущность. Ну и конечно критериев доп. может быть много. Очевидно что простым запросом (или одним правилом валидации) тут не отделаться. Сама по себе корзина как сущность может и не существовать в БД в виде единственной таблицы. Она может состоять из десятка таблиц. Но тем не менне это Сущность (модель объекта предметной области). А вот операции характерные для предметной области это службы или сервисы (сервис валидации, сервис сохранения и т.д.). Так вот вопрос, как такие не типовые задачи решают современные фреймворки типа Laravel, Yii, Symfony? И конечно в первую очередь меня интересует валидация, особенно та что требует не тривиальной работы с БД, как такое реализовать не нарушая SOLID ? или по другому как SOLID может помочь в реализации такой задачи ?
 

Adelf

Administrator
Команда форума
Простые правила валидации для одного атрибута придумали чтобы оптимизировать код. Разумеется, сложная валидация тоже имеет место быть и не надо стесняться реализовывать ее как надо(сервис валидации или как ты там хочешь).

Фреймворки не решают эту проблему. Ее ты сам должен решить.

Пиши код правильно и никакого SOLID ты не нарушишь. Если выделишь сложную валидацию в отдельный сервис - SOLID будет тобой доволен.
 

x00xer

Новичок
Пиши код правильно и никакого SOLID ты не нарушишь. Если выделишь сложную валидацию в отдельный сервис - SOLID будет тобой доволен.
Даже отвечать не буду, скажу только спасибо за "конструктивный" ответ


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

Adelf

Administrator
Команда форума
Помоему, спецификацию для валидации юзать - перебор. Валидация простая вещь по сути.

По крайней мере в том виде, который по ссылке.
 

Sufir

Я не волшебник, я только учусь
Для реализации сложных и гибких бизнес правил в домене, а речь об этом, на сколько я понял, самое то, я думаю. По крайней мере описанный пример на вскидку не плохо ложится. А так конечно, где-то, и assert'ов за глаза.
 
Сверху