Лучшее место для проверки в модели / представлении / модели контроллера?

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

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

Каковы преимущества?

Related of "Лучшее место для проверки в модели / представлении / модели контроллера?"

Если вы проверяете данные на стороне клиента (например, проверку Javascript), которая абсолютно не достаточна и не защищена вообще, ее следует реализовать в представлении.

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

Если для проверки требуется бизнес-логика, выполните ее внутри модели и вызовите ее через контроллер.

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

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

Правильное место для проверки – это Модель .

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

  • Если вы меняете данные из представления, вы должны проверить проверки.

  • Если у вас есть контроллеры, изменяющие данные, вы должны проверить проверки.

  • И, наконец, если у вас есть сама модель, меняющая данные, вы все равно должны иметь проверки.

Единственный способ добиться этого состояния состоит в том, чтобы пройти валидацию в модель.

Из-за производительности и более быстрого ответа после реализации валидаций в модели вы должны попытаться добавить какую-то клиентскую сторону (JS), чтобы немедленно уведомить конечного пользователя.

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

Валидация в модели, по-видимому, является наиболее распространенным подходом (в итоге вы $obj->isValid() что-то вроде $obj->isValid() ), и это подходит во многих ситуациях.

Однако, в зависимости от вашего варианта использования, могут быть веские причины для выполнения проверки вне модели, либо с использованием отдельного кода проверки, либо в контроллере и т. Д .:

  • Если большая часть общей проблемы проверки связана с информацией, недоступной модели (например, если пользователь-администратор может выполнять преобразования, которые обычный пользователь не может или некоторые свойства не могут быть изменены после определенной даты), тогда вы можете проверить все эти ограничения в одном и том же месте.
  • Также может быть удобно или необходимо применять очень слабые правила проверки при построении объектов для тестов. (Объекту «корзина» обычно может потребоваться связанный пользователь, который, в свою очередь, требует действительного адреса электронной почты и т. Д. 100% действительный объект корзины покупок может быть неудобным для создания в модульных тестах корзины покупок.)
  • По историческим причинам правила проверки могут измениться (например, принудительное использование «пола», где ранее не было необходимости), и поэтому вы можете получить разные версии данных, которые нужно обрабатывать по-разному. (Различные правила валидации могут также применяться к импорту массовых данных).
  • Если проверка очень сложна, вы можете предоставить различные сообщения об ошибках (или вообще ничего) в зависимости от того, что наиболее полезно для вызывающего. В других ситуациях true или false может быть все, что необходимо.

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

Не путайте с дезинфекцией или очисткой опубликованного значения с помощью проверки. Вы должны получить опубликованные значения и счистить их, удалив любые вредоносные элементы из значений в контроллере. Затем отправьте данные в Модель для проверки на ожидаемые значения или формат. Разбирая эти действия на две процедуры, вы уменьшаете риск появления вредоносного кода. Этот метод работает хорошо, если вы используете политику «доверие никому»; зная, что некоторые программисты могут стать неаккуратными или ленивыми. Другая положительная сторона мешает вашей модели стать раздутой и переработанной, если это так, то используйте вспомогательную модель для выполнения грязной работы. Этот подход также поможет сбалансировать нагрузку на приложение и повысить производительность.