Я создаю традиционное приложение MVC. У меня есть папка/lib, которая определяет функции, которые работают с операциями с базой данных и имеет дело с внешними API. При обработке ввода пользователя, где я должен проверять данные? Должен ли я проверять его в контроллерах маршрутов, а затем отправлять эти проверенные данные в функции базы данных? Или мне не нужно проверять в контроллерах маршрутов и выполнять ли функции в папке/lib все проверки?Где вы должны проверить/дезинформировать данные?
ответ
Для меня самое естественное место в модели, потому что оно содержит данные. В Принципе экспертов GRASP говорится, что вы должны назначать обязанности объекту, который имеет информацию для их выполнения.
Мы можем утверждать, что контроллер может иметь всю информацию (данные), необходимую для проверки, но для меня контроллеры должны быть легкими. Более того, я считаю, что «вся информация» означает не только наличие данных, которые вы должны подтвердить, но также знание их формата, и это проблема модели. Контроллер может знать, как должны быть данные, которые должна удовлетворять определенная модель, но эта модель также может использоваться вне этой области управления, поэтому она не должна полагаться на проверку контроллера, чтобы работать хорошо, поскольку модель (почти) имеет последний шанс обнаруживать недействительные данные (вы можете и должны также делать это в базе данных, но данные должны быть проверены и дезинфицированы до того, как они войдут в него, хотя обычно есть прямая совпадение между схемой базы данных и валидацией, которую вы должны делать в модели) ,
Каждый раз, когда вы выполняете операции CRUD с моделью, вам, вероятно, придется проверять данные, и вы убедитесь, что ваши данные почти всегда правильны. Более того, контроллер мог также изменить данные, которые затем попадают в эту модель, поэтому, даже если контроллер проверил это ранее, он может привести к недействительным данным.
Однако подумайте об этом. Контроллер может изменить данные и на самом деле много времени они делают. Необычно всегда иметь прямую карту между полями в форме и моделью, и иногда у вас будут входные данные, которые не имеют ничего или мало общего с какой-либо моделью, поэтому вы должны проверить их вне модели. Например, подумайте о поле «Повторить пароль». Это не имеет никакого отношения к модели! Только поле «Пароль» должно достигнуть этого.
Другие люди скажут, что предпочитают anemic models, и в некоторых сценариях они могут поместиться лучше, чем богатые, но у них также есть некоторые недостатки и богатые, которые лучше всего подходят в целом.
Вы также должны рассмотреть вопрос о валидации на стороне клиента (например, JS), чтобы вы могли дать ему быструю обратную связь о том, что он делает, вместо того, чтобы отправлять данные на сервер для проверки, а затем ждать ответа или даже снова загрузите всю страницу!
Один хороший способ сделать это - использовать регулярное выражение, потому что у вас будут похожие выражения между разными языками, которые вы используете, хотя чаще всего этого будет недостаточно. Или лучше, вы можете использовать JS везде с Node.js и полностью забыть об этой проблеме.
Возможно, это не тот ответ, который вы искали, но есть не один правильный способ сделать проверку, поскольку он отличается для каждого приложения.В большинстве случаев проверка должна выполняться в разных местах, выполняя ту же проверку в некоторых разных слоях вашего приложения и различную проверку между некоторыми другими.
Есть еще вопросы по этой теме на StackOverflow, так что вы можете проверить их, чтобы иметь разные мнения от других людей:
Отличный ответ спасибо. – Jon
Одним из лучших подходов, которые я видел, является определение сервисов и проверка уровня поверх них с помощью декораторов. Если возникают ошибки проверки, создается настраиваемое исключение, содержащее ошибки проверки, которые пойманы и обрабатываются контроллером и отправляются обратно клиенту.
Контроллеры должны быть тонкими и иметь дело с вещами, такими как запросы и ответы, а не бизнес-логикой. Какой бы подход вы ни использовали, я бы посоветовал попытаться отключить его от контроллеров.
- 1. Где вы должны включить SSL?
- 2. Где вы должны сохранить свои файлы IIS
- 3. Meteor.js - Должны ли вы денормализовать данные?
- 4. Где службы Windows должны записывать данные приложения?
- 5. Сиро: где должны храниться учетные данные?
- 6. Вы должны ToList()?
- 7. , где данные должны располагаться в n-уровневой (многоуровневой) архитектуре?
- 8. Где вы должны использовать реализации BlockingQueue вместо простых реализаций очереди?
- 9. Где вы должны поместить * при объявлении указателя в C?
- 10. C#: Где вы должны размещать делегаты обработчика событий?
- 11. Где вы должны хранить много настраиваемых строк в RoR?
- 12. Где вы должны поместить логику в приложение Express, достигнув маршрута?
- 13. Где вы должны помещать глобальные константы в программу на C++?
- 14. Где вы должны поместить свойства приложения в приложение erbar?
- 15. Где вы должны хранить ваши постоянные строки в .NET.
- 16. Кто, что, когда, где и почему вы должны кодосмотр?
- 17. Где вы должны поместить класс, расширяющий приложение в jax.rs
- 18. Где вы должны установить signpost .jars в android studio?
- 19. Где вы должны применять преобразования при расширении Android ImageView?
- 20. Где вы помещаете свои словарные данные?
- 21. Что вы должны делать?
- 22. Вы должны позвонить removeView
- 23. Вы должны добавить ссылку
- 24. Где должны реагировать стили?
- 25. Где должны находиться ViewModels?
- 26. MVC где должны идти алгоритмы?
- 27. Где должны вторичные данные (например, авторизации/идентичности) обрабатываться в приложении
- 28. Насколько вы должны делать ваши наблюдаемые/прослушиваемые данные?
- 29. Как вы должны форматировать данные, отправляемые между клиентом и сервером?
- 30. Где мы должны хранить наши двоичные данные теста?
Обратите внимание, что валидация и дезинфекция другие вещи. Вы проверяете как можно быстрее; вы санируете как можно безопаснее. Вы можете проверить имя пользователя с регулярным выражением на странице регистрации, но вы дезинфицируете его после того, как он находится на вашем сервере, или кто-то может использовать консоль для отправки несаминированной версии, минуя хороший кусок вашей безопасности. –