Общее распределение обязанностей в MVC обычно выглядит следующим образом:
- Модель: бизнес логика. Многие люди думают, что модель - это просто интерфейс с базой данных, но это неверно. Модели в вашей системе должны описывать все объекты в вашей системе, как они себя ведут и как они взаимодействуют. Доступ к данным - лишь малая часть этого (и, возможно, его даже следует разделить на собственный уровень доступа к данным, отдельный от модели, представления или контроллера). Например, в приложении для ведения блога блог будет иметь коллекцию постов, и каждая запись может иметь (в зависимости от функций, которые реализует приложение для блогов) коллекцию комментариев. Это будет означать реализацию класса блога, класса поста и класса комментариев. Если вы решите удалить сообщение, оно несет ответственность за то, чтобы оно не оставляло никаких лишних комментариев. Вы могли бы сделать это, имея метод в классе записей для удаления сообщения и аналогичный метод в классе комментариев. Когда сообщение получает сообщение об удалении, оно как часть процесса удаления отправляет сообщение об удалении всем комментариям, связанным с удаляемым сообщением.
- Вид: логика представления. Представление - это в основном веб-страница, RSS-канал, файл CSV, фактически любые данные, которые ваше приложение может вывести конечному пользователю. Он должен просто отображать переменные, которые были ему присвоены. (Можно реализовать некоторую логику в представлении, если оно связано с выводом данных. Представления не должны быть полностью тупыми)
- Контроллер: клей логики. Контроллер в основном выполняет две задачи: 1) берет данные из модели, внедряет их в представление и представляет их пользователю. 2) Получите данные от пользователя, отправьте их соответствующей модели для обработки и представьте результаты пользователю. Это означает, что контроллер должен содержать очень мало кода, всего лишь то, что необходимо для достижения двух целей, перечисленных выше.
Как я уже упоминал, многие думают, что модель - это нечто большее, чем уровень доступа к данным. Обычно вы можете сказать, когда люди следовали этой философии дизайна, потому что в результате получаются модели, которые мало что делают, и контроллеры, которые делают слишком много (так называемый антишаблон Fat Controller). Проблема с этим подходом состоит в том, что если вы хотите повторно использовать части вашей кодовой базы в каком-либо другом проекте, то вы не можете перенести модель в новый проект, не взяв вместе с ним большой кусок контроллера. Контроллеры, как правило, считаются специфичными для приложения и поэтому не подлежат повторному использованию. Модели, с другой стороны, включают сущности в ваше приложение, и у вас может быть несколько приложений, требующих использования сущностей одного типа (программное обеспечение для ведения блогов, витрины электронной коммерции и доски объявлений - все очень разные приложения, но все они нуждаются в реализовать пользователей).
Как правило, вам нужны толстые модели (которые можно легко использовать повторно без копирования кода, не реализованного в самой модели) и узкие контроллеры (которые можно легко заменить, когда ваша модель будет делать что-то еще).
Валидация, в свою очередь, добавляет в работу гаечный ключ, так как это то, что называется сквозной задачей. Идея MVC заключается в разделении интересов, поскольку она направлена на то, чтобы охарактеризовать код как попадающий в одну из трех основных категорий (бизнес-логика, логика представления, логика склеивания), но проверка не всегда легко вписывается ни в одну из них. Можно привести веские аргументы в пользу того, что это и бизнес-логика, и клейкая логика, и если вы хотите отобразить ошибки валидации для пользователя, тогда у него также есть элемент логики представления.
Как правило, я реализую уровень проверки в моих моделях, как правило, довольно базовые проверки работоспособности (например, требующие, чтобы целые числа были фактически значениями типа и т. Д.), И реализую отдельный набор классов для полной проверки ввода. Я вызову классы проверки в моем контроллере, и если проверка не пройдет там, я представлю результаты представлению. Если это удается, то данные отправляются в соответствующую модель для обработки. Я полагаю, вы можете назвать валидацию «служебной логикой», то, что вам нужно делать регулярно, которую вы не можете привязать ни к одной модели, представлению или контроллеру.