Определите «Проверка в модели» - PullRequest
4 голосов
/ 07 июня 2010

Было несколько обсуждений относительно местоположения проверки ввода пользователя:

Нужно ли проверять объекты формы или модель?

Где вы проводите проверку? модель, контроллер или вид

Эти дискуссии были довольно давними, поэтому я хотел снова задать вопрос, чтобы посмотреть, есть ли у кого-нибудь свежая информация. Если нет, заранее прошу прощения.

Если вы пришли из Валидации в Модельном лагере - означает ли Модель ООП представление данных (т.е. Active Record / Data Mapper) как «Сущность» (заимствуя терминологию DDD) - в этом случае вы, я полагаю, хотите, чтобы все классы модели наследовали общие ограничения проверки. Или же эти правила могут быть просто частью Сервиса в Модели - то есть Сервиса Валидации? Например, не могли бы вы рассмотреть Zend_Form и его валидационные классы как часть Модели? Концепция модели предметной области, по-видимому, не ограничивается сущностями, поэтому проверка не обязательно должна ограничиваться этими сущностями.

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

Ответы [ 6 ]

2 голосов
/ 07 июня 2010

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

1 голос
/ 16 июня 2010

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

1 голос
/ 07 июня 2010

Я использую Zend_Form как часть моих моделей - модели создают объекты Zend_Form. Я иду по этому пути, потому что Zend_Form не только о рендеринге формы; в сочетании с Zend_Validate и Zend_Filter это очень мощный инструмент (мой фаворит из стека ZF). Мэтью Вейер О'Финни написал хороший пост об использовании Zend_Forms в моделях: http://weierophinney.net/matthew/archives/200-Using-Zend_Form-in-Your-Models.html

0 голосов
/ 06 марта 2012

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

0 голосов
/ 01 июля 2010

Я не использовал PHP и не работал с Zend Framework (слышал, однако), но мне действительно нравится сообщение в блоге Джимми о проверке с точки зрения доменного дизайна.

0 голосов
/ 07 июня 2010

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

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

Такие классы, как Zend_Form, являются не более чем абстракцией вашего взгляда.

...