Ответ 1
Возможно, не лучшая идея взглянуть на Rails как на основной шаблон дизайна MVC. Упомянутая структура была сделана с некоторыми присущими ей недостатками (я как-то подробно остановился на ней в в другом сообщении), и сообщество только сейчас приступило к устранению последствий. Вы можете посмотреть DataMapper2 development как первый важный шаг.
Некоторая теория
Люди, дающие этот совет, похоже, страдают от довольно распространенного заблуждения. Поэтому позвольте мне начать с этого: Модель, в современном шаблоне проектирования MVC, НЕ является классом или объектом. Модель - это слой.
Основная идея шаблона MVC - Разделение проблем, и первым шагом в нем является разделение между слоем представления и уровнями модели. Точно так же, как слой презентации разбивается на контроллеры (экземпляры, ответственные за работу с пользовательским вводом), представления (экземпляры, ответственные за логику пользовательского интерфейса) и шаблоны/макеты, а также слой модели.
Основными частями, из которых состоит слой модели, являются:
-
Также известен как объекты домена, бизнес-объекты или объекты модели (мне не нравится это последнее имя, потому что оно просто добавляет к путанице). Эти структуры - это то, что люди обычно ошибочно называют "моделями". Они несут ответственность за составление бизнес-правил (все математические данные и валидация для определенной единицы логики домена).
-
Абстракции хранения:
Обычно реализуется с использованием шаблона отображения данных (не путайте с ORM, которые злоупотребляют этим именем). Этим экземплярам обычно задают задачу хранения и извлечения информации в объекты домена. Каждый объект домена может иметь несколько картографов, как и несколько типов хранилищ (БД, кеш, сеанс, файлы cookie,/dev/null).
-
Услуги:
Структуры, ответственные за прикладную логику (то есть взаимодействие между объектами домена и взаимодействие между объектами домена и абстракциями хранения). Они должны действовать как "интерфейс", через который слой представления взаимодействует с уровнем модели. Обычно это происходит в Rails-подобном коде в контроллерах.
Есть также несколько структур, которые могут находиться в пространствах между этими группами: DAOs, единицы работы и репозитории.
О... и когда мы говорим (в контексте сети) о пользователе, который взаимодействует с приложением MVC, это не человек. "Пользователь" на самом деле является вашим веб-браузером.
А как насчет божеств?
Вместо того, чтобы работать с некоторой страшной и монолитной моделью, контроллеры должны взаимодействовать с сервисами. Вы передаете данные из пользовательского ввода в конкретную службу (например, MailService
или RecognitionService
). Таким образом, контроллер изменяет состояние уровня модели, но это делается с использованием прозрачного API и без вмешательства во внутренние структуры (что приведет к негерметичной абстракции).
Такие изменения могут либо вызвать некоторую немедленную реакцию, либо повлиять только на данные, которые запрашивает запрос экземпляра на уровне модели, или и то, и другое.
Каждая служба может взаимодействовать с любым числом (хотя обычно это всего лишь несколько) объектов домена и абстракций хранилища. Например, RecogitionService
не может заботиться о абстракциях хранения для статей.
Закрывающие заметки
Таким образом вы получаете приложение, которое может быть подвергнуто единичному тестированию на любом уровне, имеет низкое соединение (если оно правильно реализовано) и имеет понятную архитектуру.
Хотя, имейте в виду: MVC не предназначен для небольших приложений. Если вы пишете страницу гостевой книги с использованием шаблона MVC, вы делаете это неправильно. Этот шаблон предназначен для обеспечения правопорядка в крупных приложениях.
Для людей, которые используют PHP в качестве основного языка, этот пост может иметь значение. Это немного более длинное описание слоя модели с несколькими фрагментами кода.