Что определяет традиционную концепцию «страницы» в MVC? - PullRequest
6 голосов
/ 17 апреля 2009

В настоящее время я использую CodeIgniter в качестве основы при использовании PHP. Одна из вещей, с которой я борюсь, - это идея «страницы» и как правильно представить ее в MVC. Насколько мне известно, CodeIgniter имеет фронт-контроллер, который делегирует контроллеры страниц. В моем мыслительном процессе каждая страница будет иметь свой собственный контроллер. Слишком часто, хотя я вижу, что кто-то использует контроллер страницы, наполненный многими методами. Так что в этом смысле каждое действие становится отдельной страницей.

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

Что еще более запутывает, так это то, что я заметил, что в некоторых веб-приложениях у них будет один контроллер, который будет иметь несколько методов (например, вход в систему, регистрация, просмотр, редактирование и т. Д.), Но в других случаях они фактически контроллер входа в систему и контроллер регистра. Как правильно использовать «контроллер страницы»?

Ответы [ 3 ]

7 голосов
/ 17 апреля 2009

С точки зрения домена, я определенно говорю, что имеет смысл иметь 1 контроллер на контекст домена. Не обязательно по одному на страницу, хотя в зависимости от контекста это может иметь место. Под контекстом я подразумеваю «тесно связанные действия».

Например, контроллер аккаунта должен обрабатывать логин, регистрироваться, выходить из системы, менять пароль, действия. Все они живут в контексте «Аккаунта»

Возьмем, например, Stackoverflow. У меня будет контроллер «Вопросы», который будет выполнять такие действия, как DisplayQuestion, AskQuestion, Удалить вопрос, MostRecent Вопросы и т. Д. Все они представляют собой разные «Представления / страницы», которые управляются одним контроллером.

1 голос
/ 17 апреля 2009

В MVC «страница» - это то, что вы получаете, когда вы складываете три вместе. Модель обрабатывает слой данных, представление обрабатывает фактический HTML, который видит пользователь, и контроллер решает, как они взаимодействуют друг с другом, чтобы показать желаемые данные. Мой выбор в отношении использования отдельного контроллера или другого метода для существующего контроллера зависит от того, насколько близка операция к другому контроллеру (ам), которые у меня есть. Скажем, я хотел иметь контроллер UserAdmin, теперь он, скорее всего, будет обрабатывать добавление пользователя, удаление пользователя, изменение паролей и т. Д. Если бы я добавлял функциональность, которая каким-то образом касалась изменения учетной записи пользователя, я бы, скорее всего, поставил бы его там. Если бы я разделил их на их собственные контроллеры, я бы, естественно, добавил еще один. Контроллеры позволяют вам размещать похожие задачи вместе, чтобы они могли использовать то, что уже есть в классе, вместо того, чтобы заново создавать то, что уже было сделано. Многое из того, как программист считает, что это должно быть сделано. То, что имеет смысл для вас, может не иметь смысла для меня, это выбор разработчика (или дизайнера).

1 голос
/ 17 апреля 2009

Вы правы в том, что каждый публичный метод в контроллере становится "страницей". При этом, это не обязательно веб-страница, действие может быть публикацией данных и затем перенаправлять на другое действие / страницу, поэтому страница не обязательно означает «веб-страница».

MVC использует множество соглашений, чтобы заставить вещи работать. Например, каждый контроллер должен заканчиваться на «Контроллер». Таким образом, набор пользовательских страниц (создание, редактирование, удаление и т. Д.) Будет в UserController. В папке Views каждый открытый метод или действие в классе контроллера становится веб-страницей в папке, которая соответствует префиксу контроллера (в данном случае, папке User). Таким образом, действие под названием «Удалить» в классе контроллера будет указывать на страницу Delete.aspx в папке «Пользователь».

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

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