Вопрос

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

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

я использую КодИгнитер но я бы рискнул предположить, что это не ограничивается только этим или, возможно, даже только фреймворками 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 «части»:

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

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

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

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

  1. Имейте класс модели для каждой таблицы базы данных.В данном случае это будет объект, содержащий все сведения о продукте.
  2. Поместите эти классы в пакет/пространство имен, например, com.company.model (Java/C#).
  3. Поместите классы DAO в пакет типа com.company.model.dao.
  4. Ваше представление будет использовать данные из сеанса/запроса/контроллера. В этом случае у меня будет List<Product>.
  5. О, вы используете PHP.Не знаю, как это меняет ситуацию, но я думаю, что у него есть структура коллекций, как и у любого современного языка.

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

  • Запираемый
  • Опубликованный
  • Тегируемый
  • Оцениваемый
  • Комментируемый

и т. д.

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

Сюда помещается все, что фактически не имеет ничего общего с CakePHP.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top