Какой код должен идти куда в структуре MVC - PullRequest
5 голосов
/ 07 мая 2010

Моя проблема находится где-то между моделью и контроллером. У меня все работает идеально, когда я использую MVC только для crud (создание, чтение, обновление, удаление). У меня есть отдельные модели для каждой таблицы базы данных. Я получаю доступ к этим моделям из контроллера , чтобы грубо их. Например, в приложении контактов у меня есть действия (создание, чтение, обновление, удаление) в контроллере (контакт) для использования методов модели (контакта) (создание, чтение, обновление, удаление).

Проблема начинается, когда я пытаюсь сделать что-то более сложное. Есть некоторые сложные процессы, которые я не знаю, куда мне их поставить.

  1. Например, при регистрации пользовательского процесса. Я не могу просто завершить этот процесс в пользовательской модели, потому что мне приходится использовать и другие модели (отправка писем, создание других записей для пользователя с помощью других моделей) и выполнять множество сложных проверок с помощью других моделей.
  2. Например, в некоторых сложных процессах поиска мне нужно получить доступ ко множеству моделей (статьи, видео, изображения и т. Д.)
  3. Или иногда мне нужно использовать apis, чтобы решить, что мне делать дальше или какую модель базы данных я буду использовать для записи данных

Так, где это место, чтобы делать эти сложные процессы? Я не хочу делать их в контроллерах, потому что иногда я должен использовать эти процессы и в других контроллерах. И я не хочу помещать эти процессы в модели, потому что я использую модели в качестве слоев доступа к базе данных. Может быть, я ошибаюсь, я хочу знать. Спасибо за ваш ответ .

Ответы [ 6 ]

3 голосов
/ 07 мая 2010

Просто краткий комментарий (нет решения) AFAIK - это вечный вопрос - MVC - это просто шаблон, и как таковой, в теории реализуемо чисто На практике из-за ограничений, установленных доступными инструментами (такими как содержимое библиотеки языка программирования и дизайн интерфейса компонента пользовательского интерфейса ...), вам приходится принимать локальные решения. Важно то, что вы стремитесь отделить их ... и не иметь все в одном беспорядке. Я снимаю свой комментарий с эфира, и мне остается узнать, есть ли у кого-то «окончательное решение».

1 голос
/ 07 мая 2010

Для простых задач я бы написал помощники действий (например, sendNewsletter).

Для сложных задач я бы создал службы (например, электронная почта, аутентификация и т. Д.).

1 голос
/ 07 мая 2010

Я бы сделал ваши контроллеры простыми.

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

лично я стараюсь, чтобы мои модели напоминали объекты реального мира, а не таблицы или строки баз данных. Это делает это намного проще, если вы заставляете вещи говорить более понятными словами. Один объект реального мира может включать 5 или 6 таблиц базы данных ... И было бы довольно сложно говорить с 5 или 6 моделями, когда все, что вам нужно сделать, это включить переключатель, выбрать цветок или нарисовать значок или отправьте сообщение.

1 голос
/ 07 мая 2010

В MVC вы должны поместить эти вещи в модель (по причинам повторного использования для одного).

Однако в HVMC вы можете разместить их где угодно (например, в контроллере) и вызывать контроллеры из вашего приложения.

0 голосов
/ 20 июля 2010

Держите ваши контроллеры в чистоте. Для серверной обработки используйте классы Manager, такие как MailManager и т. Д.

0 голосов
/ 07 мая 2010

Что не так с контроллером, использующим несколько моделей? Разве MVC не делает эту модель многоразовой? В вашем первом сценарии совершенно нормально отправлять электронные письма и манипулировать другими объектами модели, где бы ни находился код контроллера «зарегистрировать пользователя».

Что касается вашего второго сценария, почему SearchController не может использовать ArticleModel, ImageModel и VideoModel? Хорошо иметь контроллер без модели. SearchController не нужен класс SearchModel, он просто использует другие классы модели.

Я пытаюсь не разгуливать о MVC в веб-приложениях, но, по сути, IMHO, контроллер - это просто высокоуровневый список шагов для завершения операции. В качестве грубого примера код контроллера «зарегистрировать пользователя» должен выполнять каждый из следующих шагов примерно в одну или две строки кода:

  1. Подтвердить ввод
    1. Если значение недействительно, перезапустите форму с ошибкой
  2. Создать новый UserModel объект из формы ввода
  3. Вставить новый объект UserModel в базу данных
  4. Создание / редактирование любых других необходимых объектов модели
  5. Отправить электронное письмо новому пользователю
  6. Отображение страницы "регистрация прошла успешно"

То, как эти шаги кодируются, во многом зависит от того, какую платформу / архитектуру вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...