Что определяет концепцию традиционной страницы в MVC?

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

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

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


person Joe    schedule 17.04.2009    source источник


Ответы (3)


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

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

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

person Micah    schedule 17.04.2009

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

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

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

person Chris Conway    schedule 17.04.2009
comment
Ваша точка зрения о том, что каждый контроллер должен заканчиваться на «Контроллер», применима только к инфраструктуре Asp.Net Mvc, а не обязательно к инфраструктуре PHP, с которой он имеет дело. - person Micah; 17.04.2009

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

person Daniel    schedule 17.04.2009