Поделитесь мнением/опытом - как, на ваш взгляд, правильнее поступать?
Приходят данные от пользователя на сервер (пусть он будет на, к примеру, Yii2). Применяются правила валидации, затем сохраняем их в БД. Как ужесточать условия проверки данных - от фреймворка к БД (т.е. фреймворк должен быть более дотошным) или наоборот?
К примеру, получаем некое item_id
- сначала удостоверяемся, что это целое положительное число
- затем проверяем, что этот самый item_id есть в таблице items
- ...
- сохраняем в БД
или же
- только удостоверяемся, что item_id != null
- сохраняем в БД, при этом поле (при создании таблицы) задаем как INTEGER UNIQUE
В первом случае ловим ошибки еще на подлете, во втором - уже по факту (exception-ами)
Вопрос, возможно, из серии вкуса фломастеров, но вдруг есть какие-то серьезные аргументы в пользу первого или второго подхода.
Есть чёткая логика для этой ситуации:
1. На фреймворке лишь проверяем тип данных:
item_id - целое положительное?
1.1 Да - значит передаём в шаблон формирования запроса к БД
1.2 Нет - генерируем ошибку фреймворку, как невалидность входных данных пользователя.
2. на существование - проверяет запрос сохранения в базе через WHERE, таким образом - один запрос, вместо двух и проверку - мы отдаём базе и ловим код выполнения запроса.
Если запрос добавления в базу не был успешным:
2.1 либо запрашиваем детальную информацию об ошибке,
2.2 либо НЕ запрашиваем и сразу генерируем ошибку добавления фреймворку.
Шпаргалка выглядит так:
1. Валидируем данные перед их непосредственным использованием.
2. Если принимающая сторона (модуль системы) делает валидацию без последствий для безопасности и с сохранением логики необходимой обработки - всегда отдаём валидацию на принимающую сторону (в данном примере - это сервер БД).