Вы должны подтвердить в модели? (Вопрос на основе Symfony, но связанный с общим MVC) - PullRequest
6 голосов
/ 25 января 2010

Это быстрый вопрос, относящийся к Symfony, но может быть общим вопросом MVC.

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

Теперь я сделал так, чтобы все мои формы Symfony проверяли, что email_address уникален для данного WebUser, однако мне интересно, следует ли мне добавить эту проверку также в модель?

Но это также заставило меня задуматься, должны ли вы на самом деле проверять каждый set() метод в модели? Это кажется достаточно мудрым решением, чтобы убедиться, что в базе данных нет ошибочных данных, однако большинство (если не все) данные должны проходить через контроллеры, которые также проверяют правильность. Так что мне кажется, что я дважды провожу одну и ту же проверку, и это кажется бессмысленным?

Что вы думаете об этом? Я все еще склоняюсь к проверке в модели, так как это имеет смысл, поскольку она диктует бизнес-логику.

Если вам нужно проверить в модели, как вы генерируете соответствующую ошибку set() в Symfony, которая корректно обрабатывается каркасом формы?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 26 января 2010

Я не согласен с «Проверка должна быть частью логики домена, а не логики внешнего интерфейса».

Проверка - сложная функциональная часть вашего приложения, и должен учитывать контекст. то есть. Вы должны знать, вошел ли пользователь в систему, какие учетные данные он имеет, статус запроса / формы и так далее. Вместо этого модели должны быть независимыми от контекста (для работы в любой среде не только http-запрос, но также cli и т. Д.), Чтобы они не знали о пользователе, состоянии и http-запросе. Это строгое требование для тестируемости классов вашей модели.

По вышеупомянутой причине функциональная проверка должна принадлежать форме, которая знает состояние приложения (т. Е. Сеанс). Symfony очень помогает с классами sfValidator *, которые действительно принадлежат компоненту формы. Вот почему формы тестируются с помощью функциональных тестирований.

Вместо этого в модели должна проводиться проверка данных (т. Е. Проверить, является ли значение целым числом или строкой, проверить, является ли оно нулевым, и т. Д.). Это легко сделать с помощью правил проверки в Doctrine.

3 голосов
/ 25 января 2010

Я не могу говорить конкретно с Symfony, но я знаю, что я намеренно избегаю проверки формы Zend Framework и вместо этого проверяю свои модели (Zend Framework не предоставляет свой собственный компонент Model, поэтому у него нет реального мнения по этому вопросу. ).

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

Причины, по которым проверка моделей лучше всего:

  • Существует вероятность того, что модель изменит данные после того, как они пройдут через форму и до того, как они попадут в БД
  • Валидация должна быть частью логики домена, а не интерфейсной логики (я понимаю, что Symfony, похоже, не согласен).
  • Состояние проверки перемещается с объектом модели, а не с объектом формы.

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

РЕДАКТИРОВАТЬ: В конце концов, может быть, имеет смысл просто пойти с вашими рамками на этом. Если Symfony кажется наиболее склонным к проверке в контроллере и не предоставляет простой путь для проверки в модели, просто следуйте тому, что они хотят, чтобы вы делали (или направление, в котором склоняется сообщество Symfony). Сражаться с рамками никогда не бывает весело.

0 голосов
/ 25 января 2010

Думаю, вам следует воспользоваться набором средств MVC Validator Tool. Использование других зависит от модели, ее проще, а также тестируемой и основанной на форме, выбранной не для модели, которая дает вам возможность свободного пробега

С уважением, Марван Хафез

0 голосов
/ 25 января 2010

Я не могу помочь с частью Symfony, но большинство MVC-Frameworks выполняют проверку в модели, поскольку это единственное место в среде MVC, где проверка должна быть.
Это касается проверки атрибутов модели, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...