Каким будет мой контроллер в этих сценариях в веб-приложении mvc?

1) Где главная страница вашего сайта вписывается в «контроллеры»? Я видел, как некоторые люди используют контроллер «страницы» для обработки статических страниц, таких как «о нас», «дом», «контакты» и т. д., но мне это не кажется хорошей идеей. Будет ли лучшим вариантом создание отдельного контроллера только для вашей домашней страницы? В конце концов, ему может потребоваться доступ к нескольким моделям, и он не очень хорошо сочетается со всем, один контроллер на теорию модели, которую используют некоторые люди.

2) Если вам нужна панель мониторинга для нескольких типов пользователей, будет ли это один контроллер панели, который будет иметь код переключения, зависящий от того, какой пользователь, или, скажем, действие панели в каждом контроллере для каждого пользователя? Например, admin/dashboard, account/dashboard и т. д.

3) Мне кажется, что использование всего простого примера CRUD работает как шарм при попытке объяснить контроллеры, но как только вы пройдете мимо этих простых функций, он сломается и может привести к тому, что ваши контроллеры станут громоздкими. Почему некоторые люди предпочитают создавать контроллер входа в систему, тогда как другие делают функцию входа в систему в пользовательском контроллере? Одна из причин, по моему мнению, заключается в том, что многие из нас исходят из опыта работы со страницами, и трудно думать о контроллерах как об «объектах» или «существительных», потому что страницы не всегда работают таким образом. Показательный пример, с какой стати вы хотите создать контроллер «страниц», который будет обрабатывать страницы, которые на самом деле не имеют ничего общего друг с другом, просто для того, чтобы иметь «контейнер» для размещения действий. Просто не кажется мне правильным.

4) Должны ли контроллеры иметь больше общего с вариантом использования, чем с «объектом», над которым могут выполняться действия? Для всех интенсивных целей вы можете создать пользовательский контроллер, который выполняет каждое действие во всем вашем приложении. Или вы можете создать контроллер для каждой «проблемной области», как любят говорить некоторые. Или вы можете создать один контроллер для каждого представления, если хотите. Существует так много свободы действий, что трудно найти последовательный метод для использования.

Вероятно, контроллеры не должны быть такими запутанными, но по какой-то причине они чертовски сбивают меня с толку. Будем очень признательны за любые полезные комментарии.


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


Ответы (1)


1) Я использую простой доморощенный набор классов для некоторых своих материалов MVC, и он связывает имена контроллеров с именами действий и представлений (это стиль Front Controller, похожий на Zend). Для общего веб-сайта предположим, что он имеет домашнюю страницу, политику конфиденциальности, контактную страницу и страницу с информацией. Я действительно не хочу делать отдельные контроллеры для всех этих вещей, поэтому я буду вставлять их в свой IndexController с именами функций, такими как actionIndex(), actionPrivacy(), actionContact() и actionAbout().

Чтобы согласиться с этим, внутри моего каталога Views у меня есть каталог шаблонов, связанных с каждым действием. По умолчанию любое действие автоматически ищет связанный шаблон, хотя вы можете указать его, если хотите. Таким образом, actionPrivacy() будет искать файл шаблона в index/privacy.php, actionContact() будет искать index/contact.php и т. д.

Конечно, это относится и к URL-адресам. Таким образом, URL-адрес, попадающий на http://www.example.com/index/about, будет запускать actionAbout(), который загрузит шаблон страницы «О программе». Поскольку страница about является полностью статическим содержимым, мой actionAbout() абсолютно ничего не делает, кроме предоставления публичного действия, которое Front Controller может увидеть и запустить.

Итак, чтобы ответить на суть вашего вопроса, я помещаю несколько «страниц» в один контроллер, и он отлично работает для моих целей. Одна модель для каждого контроллера — это теория, которой я бы не стал следовать при работе с Web MVC, поскольку она гораздо лучше подходит для приложения с состоянием.

2) Для этого у меня было бы несколько контроллеров. Следуя тем же методам, которые я использовал выше, я бы получил /admin/dashboard и /account/dashboard, как вы предлагаете, хотя нет никаких причин, по которым они не могли бы использовать одни и те же (или части одних и тех же) шаблонов.

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

3) Я считаю, что функциональные возможности CRUD трудно внедрить непосредственно в любой уровень MVC, и при этом они должны быть чистыми, гибкими и эффективными. Мне нравится абстрагировать функциональные возможности CRUD на сервисный уровень, к которому может обращаться любой объект, и иметь базовый класс объектов, из которого я могу расширять любые объекты, нуждающиеся в CRUD.

Я бы предложил использовать некоторые из фреймворков PHP ORM для CRUD. Они могут избавиться от многих хлопот, связанных с получением хорошей реализации.

С точки зрения контроллера входа в систему по сравнению с пользовательским контроллером, я полагаю, это зависит от вашего домена приложения. С моим стилем программирования я склонен думать о «входе в систему» ​​как о простой операции в домене модели пользователя и, следовательно, иметь для нее одну операцию внутри пользовательского контроллера. Чтобы быть более точным, я хотел бы, чтобы UserController создавал модель пользователя и вызывал процедуру входа в модель. Я не могу сказать вам, что это правильный путь, потому что я не мог точно сказать, каким должен быть правильный путь. Это вопрос контекста.

4) Вы правы насчет свободы действий. Вы можете легко создать контроллер, который будет обрабатывать все, что нужно вашему приложению/сайту. Тем не менее, я думаю, вы согласитесь, что это станет кошмаром для обслуживания. Меня до сих пор мучают мысли о моей последней работе в компании по исследованию рынка, где внутреннее PHP-приложение было сделано зарубежной командой, которая, как я могу предположить, практически не обучалась. Мы говорим о скриптах на 10 000 строк, которые обрабатывают весь сайт. Удержать было невозможно.

Итак, я предлагаю вам разбить ваше приложение/сайт на области бизнес-доменов и создать контроллеры на их основе. Выясните основные концепции вашего приложения и двигайтесь дальше.

Пример

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

IndexController — обрабатывает страницу, политику конфиденциальности, общий статический контент.

UserController — обрабатывает создание учетной записи, вход/выход, настройки

PictureController - отображать картинки, обрабатывать загрузки

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

LibraryController - показать списки последних новостей и исследований

HugAManateeController - виртуальный ламантин обнимается в реальном времени через HTTP

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

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

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

Надеюсь, это поможет.

person zombat    schedule 29.04.2009
comment
Я делаю то же самое в своей среде MVC (PHP): я вставляю статические страницы, такие как index или about, в контроллер для статических страниц. Использование одного контроллера для чтения/создания/обновления/удаления в каждой модели очень редко используется в реальных приложениях. - person James Socol; 30.04.2009
comment
@Марио - ха-ха, нет. В конце концов это может быть, но это все еще очень много в процессе. Я начинаю использовать его для своего первого проекта, который будет в производстве, так что посмотрю, как пойдет. :) - person zombat; 30.04.2009
comment
Опять же @Mario - я должен отметить, что мои вещи очень похожи на Code Igniter. Я нахожу CI немного легким в отделе View, но мне нравится их подход. - person zombat; 30.04.2009