MVC, куда идут занятия?


Мое понимание MVC заключается в следующем (если это ужасно неправильно, я, в конце концов, новичок в этом)

  1. Модели - это то, что взаимодействует с базой данных
  2. Представления - это дизайн/макет страницы
  3. Контроллеры - это то, с чего все начинается, и по сути являются логикой страницы

Я использую CodeIgniter, но я бы рискнул предположить, что это не ограничивается только этим или, возможно, даже только фреймворками PHP.

Куда мне поместить глобальный занятия?

У меня может быть модель продуктов, и затем я выполняю запрос, который собирает 20 продуктов из базы данных. Должен ли я сейчас сделать 20 моделей или у меня должен быть отдельный класс для этого, если последний, то куда мне поместить этот класс (другие контроллеры тоже должны будут его использовать)

Author: Teifion, 2008-09-26

5 answers

Модель - неправильное слово, которое следует использовать при обсуждении того, что делать с продуктами: каждый продукт представляет собой объект ценности (VO) (или объект передачи данных/DTO, что вам больше подходит). Объекты значений обычно имеют те же поля, что и таблица. В вашем случае у ProductVO должны быть поля, которые находятся в таблице Products.

Модель - это Объект доступа к данным (DAO) , который имеет такие методы, как

findByPk --> returns a single value object
findAll --> returns a collection of value objects (0-n)
etc.

В вашем случае у вас был бы продукт, в котором что-то есть как и вышеперечисленные методы. Этот продукт затем вернет ProductVO и их коллекции.

Объекты доступа к данным также могут возвращать Бизнес-объекты (BO), которые могут содержать несколько VO и дополнительные методы, зависящие от конкретного бизнес-случая.

Добавление: В своем контроллере вы вызываете ProductDAO, чтобы найти нужные вам продукты. Возвращенные имена продуктов затем передаются в представление (как атрибуты запроса в Java). Затем представление перебирает/отображает данные из Продукты.

 4
Author: kosoant, 2008-09-26 12:16:14

Модель является частью вашего приложения, где происходит бизнес-логика. Модель представляет реальные отношения и зависимости между объектами, например: Сотрудник отчитывается перед менеджером, Менеджер контролирует многих сотрудников, Менеджер может назначить задачу Сотруднику, Задача отправляет уведомление при просрочке. Модель МОЖЕТ и чаще всего взаимодействует с базой данных, но это не является обязательным требованием.

Представление - это в основном все, что может быть отображено или помочь в отображении. Смотреть содержит шаблоны, объекты шаблонов, обрабатывает компоновку и вложенность шаблонов, обертывает верхние и нижние колонтитулы и выдает выходные данные в одном из хорошо известных форматов (X/HTML, но также XML, RSS/Atom, CSV).

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

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

 3
Author: Michał Rudnicki, 2008-09-26 10:08:54

В CakePHP есть еще 3 "части":

  1. Поведение
  2. Компоненты
  3. Помощники

Логика, используемая многими моделями, должна быть сделана как поведение. Я не знаю, есть ли у CodeIgniter эта логика или нет, но если ее нет, я бы попытался реализовать ее как таковую. Вы можете прочитать о поведении здесь.

(Компоненты помогают контроллеру совместно использовать логику, а помощники помогают таким же образом просматривать представления).

 1
Author: Alexander Morland, 2008-09-26 09:53:59

Самый простой способ - это:

  1. Есть класс модели для каждой таблицы базы данных. В этом случае это был бы объект, содержащий все детали продукта.
  2. Поместите эти классы в пакет/пространство имен, например, com.company.model (Java/C#)
  3. Поместите классы DAO в пакет, такой как com.company.model.dao
  4. Ваше представление будет использовать данные из сеанса/запроса/контроллера, В этом случае у меня был бы список .
  5. О, вы используете PHP. Не знаю, как это изменится вещи, но я полагаю, что у него есть структура коллекций, как и у любого современного языка.
 1
Author: JeeBee, 2008-09-26 12:01:18

@Александр упоминает о поведении CakePHPs , Компоненты и Помощники. Они отлично подходят для абстрагирования общих функций. Я нахожу такое поведение особенно полезным, поскольку, конечно, основная часть бизнес-логики заложена в моделях. В настоящее время я работаю над проектом, в котором у нас есть такие модели поведения, как:

  • Запираемый
  • Пригодный для публикации
  • Помечаемый
  • Приемлемый уровень
  • Комментируемый

И т.д.

Для кода, который выходит даже за рамки MVC, т.Е. библиотек кода, которые вы используете для различных вещей, которые не привязаны к конкретной используемой вами структуре - в нашем случае, таких вещей, как классы кодирования видео и т. Д. В CakePHP есть папка поставщики.

Все, что фактически не имеет никакого отношения к CakePHP, попадает туда.

Я подозреваю, что CodeIgniter не имеет такой гибкой структуры, он меньше и легче, чем CakePHP, но быстрый взгляд на Руководство CakePHP, чтобы увидеть, как могут быть полезны модели поведения, компоненты, Помощники и папка поставщиков.

Должно быть легко просто включить некоторые общие вспомогательные классы из ваших моделей, чтобы они были красивыми и СУХИМИ

 1
Author: reefnet_alex, 2008-09-26 12:30:22