MVC, где проходят занятия?
-
02-07-2019 - |
Вопрос
Мое понимание MVC следующее (если это ужасно неправильно, я в конце концов новичок в этом)
- Модели — это то, что взаимодействует с базой данных.
- Просмотры — это дизайн/макет страницы.
- Контроллеры — это то, с чего все начинается, и, по сути, они представляют собой логику страницы.
я использую КодИгнитер но я бы рискнул предположить, что это не ограничивается только этим или, возможно, даже только фреймворками PHP.
Где мне разместить глобальные классы?
У меня может быть модель «Продукты», и затем я запускаю запрос, который собирает 20 продуктов из базы данных.Делаю ли я сейчас 20 моделей или мне нужно иметь для этого отдельный класс, если последнее, то куда мне поместить этот класс (другие контроллеры тоже должны будут его использовать)
Решение
Модель — неправильное слово, которое следует использовать при обсуждении того, что делать с продуктами:каждый продукт представляет собой объект значения (ВО) (или объект передачи данных/DTO, что вам больше подходит).Объекты значений обычно имеют те же поля, что и таблица.В вашем случае ProductVO должен иметь поля, которые находятся в таблице Products.
Модель представляет собой Объект доступа к данным (DAO) у которого есть такие методы, как
findByPk --> returns a single value object
findAll --> returns a collection of value objects (0-n)
etc.
В вашем случае у вас будет ProductDAO, который имеет что-то вроде описанных выше методов.Этот ProductDAO затем будет возвращать ProductVO и их коллекции.
Объекты доступа к данным также могут возвращать Бизнес-объекты (БО) который может содержать несколько VO и дополнительные методы, специфичные для конкретного бизнес-кейса.
Приложение:В вашем контроллере вы вызываете ProductDAO, чтобы найти нужные вам продукты.Возвращенные ProductVO затем передаются в представление (как атрибуты запроса в Java).Затем представление циклически просматривает/отображает данные из ProductVO.
Другие советы
Модель является частью вашего приложения, в котором реализуется бизнес-логика.Модель представляет реальные отношения и зависимости между объектами, например:Сотрудник отчитывается перед менеджером, менеджер контролирует многих сотрудников, менеджер может назначать задачу сотруднику, задача отправляет уведомление в случае просрочки.Модель CAN и чаще всего DO интерфейс с базой данных, но это не является обязательным требованием.
Вид По сути, это все, что можно отобразить или помочь в отображении.Представление содержит шаблоны, объекты шаблонов, обрабатывает композицию и вложение шаблонов, обертывает верхние и нижние колонтитулы и создает выходные данные в одном из хорошо известных форматов (X/HTML, а также XML, RSS/Atom, CSV).
Контроллер — это уровень перевода, который преобразует действия пользователя в операции модели.Другими словами, он сообщает модели, что делать, и возвращает ответ.Методы контроллера должны быть как можно меньшими, и вся бизнес-обработка должна выполняться в модели, а обработка логики представления должна выполняться во представлении.
Теперь вернемся к вашему вопросу.Это действительно зависит от того, нужен ли вам отдельный класс для каждого продукта.В большинстве случаев одного класса будет достаточно, и следует создать 20 его экземпляров.Поскольку продукты представляют собой бизнес-логику, они должны относиться к моделирующей части вашего приложения.
В ТортPHP есть еще 3 «части»:
- Поведение
- Компоненты
- Помощники
Логика, используемая многими моделями, должна быть реализована как поведение.Я не знаю, есть ли в CodeIgniter такая логика или нет, но если нет, я бы попробовал реализовать ее как таковую.Вы можете прочитать о поведении здесь.
(Компоненты помогают контроллеру совместно использовать логику, а помощники помогают представлениям таким же образом).
Самый простой способ:
- Имейте класс модели для каждой таблицы базы данных.В данном случае это будет объект, содержащий все сведения о продукте.
- Поместите эти классы в пакет/пространство имен, например, com.company.model (Java/C#).
- Поместите классы DAO в пакет типа com.company.model.dao.
- Ваше представление будет использовать данные из сеанса/запроса/контроллера. В этом случае у меня будет List<Product>.
- О, вы используете PHP.Не знаю, как это меняет ситуацию, но я думаю, что у него есть структура коллекций, как и у любого современного языка.
@Александр упоминает CakePHP Поведение, Компоненты и Помощники.Они отлично подходят для абстрагирования общих функций.Я считаю, что поведение особенно полезно, поскольку, конечно, основная часть бизнес-логики содержится в моделях.В настоящее время я работаю над проектом, в котором у нас есть такое поведение, как:
- Запираемый
- Опубликованный
- Тегируемый
- Оцениваемый
- Комментируемый
и т. д.
Для кода, который выходит даже за рамки MVC, т.е.библиотеки кода, которые вы используете для различных вещей, которые не привязаны к конкретной используемой вами платформе — в нашем случае это такие вещи, как классы кодирования видео и т. д.CakePHP имеет продавцы папка.
Сюда помещается все, что фактически не имеет ничего общего с CakePHP.
Я подозреваю, что CodeIgniter не имеет столь гибкой структуры, он меньше и легче, чем CakePHP, но беглый взгляд на Руководство CakePHP чтобы узнать, чем могут быть полезны функции «Поведения», «Компоненты», «Помощники» и папка «Поставщики».
Должно быть легко просто включить некоторые общие вспомогательные классы из ваших моделей. СУХОЙ