MVC – проверка правильности ввода: контроллер, модель или оба

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

Предположим, у меня есть форма на моем сайте, с полем, который кто-то заполняет и затем отправляет. Модель хотела бы, чтобы контроллер правильно передал это значение, чтобы обработать это значение внутренне. Модель получает вход через функцию getInput , которая устанавливает следующие правила:

  • Вход должен быть типа строки.
  • Вход должен быть больше 0 и меньше или равно 100 символам.
  • Ввод должен соответствовать шаблону адреса электронной почты.

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

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

Теперь мой вопрос: какой из этих (4) правил должен быть проверен контроллером, а какие – моделью? Очевидно, что контроллер знает, что запрашивает модель, чтобы он мог приспособиться к этому (и если это не так, оно может столкнуться с последствиями генерируемого исключения). С другой стороны, кажется избыточным иметь несколько контроллеров, которые все используют модель и ее getInput , проверяя одну и ту же строку, чтобы она соответствовала правилам, установленным моделью. Кроме того, если контроллер сначала проверяет, имеет ли вход правильную длину – например, – и модель сразу же делает то же самое сразу после этого, как только getInput будет вызван, возникает еще больше избыточности.

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

Единственное, что должен заботиться ваш контроллер, – это передать данные модели и (опционально), как спросить, действительны они или нет. Фактическая проверка должна выполняться внутри модели, потому что:

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

Это зависит.

Лучший пример для DRY (не повторяйте себя), подтверждают в модели.

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

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

Проверка ввода формы для вашей конкретной цели и подтверждение правильности модели не всегда одно и то же.