Один контролер на одній сторінці чи багато сторінок в одному контролері?


16

Я просто хотів поради, що стосується способу MVC. Я використовую кодигнайтер, і мені було цікаво, чи краще мати один контролер на сторінці для веб-сайту або мати один контролер для всіх сторінок?

Скажімо, у мене простий веб-сайт, на якому ви можете зайти на домашню сторінку, увійти в систему, створити обліковий запис і зв’язатися з адміністратором.

  1. Було б краще мати такі контролери: frontend (індекс), логін, обліковий запис, контактні АБО, які мають один контролер, який називається frontend, або що інше з такими діями, як login, createAccount, contact?

  2. Коли ви знаєте, чи краще в одній ситуації використовувати один контролер?


Я завжди жив по вірі: Один Контролер, щоб керувати ними всім, і в Темряві Пов'язувати їх. (Не дуже, але мені подобається звучання цього. :-)
Пітер Роуелл

Відповіді:


17

Краще мати контролер на логічний блок, наприклад AccountController (вхід, реєстрація), PagesController (домашній, контактний), Backend -> PagesController (створити, редагувати, видалити), UsersController (створити, редагувати, видалити) тощо.


Як би ви представляли веб-сайт із тезами: домашня сторінка, логін, обліковий запис, контакт. Чи використовуєте ви два контролери, як ваш приклад? якщо ви переходите до localhost / він відкриває homecontroller, то якщо ви переходите до localhost / контакту теоретично, чи не повинен він перейти до контактного контролера? і що ви маєте на увазі під бекендом?
Рушино

Це залежить від структури сторінок і скільки сторінок у вас. Я зроблю HomeController (домашній, контактний) або PagesController (домашній, контактні АБО реквізити (id)). Наприклад, у ASP.NET MVC у вас за замовчуванням HomeController зі сторінкою Home та About.
Дід Мороз,

Мені подобається цей метод. Також ClientController (або як би ви цього не хотіли назвати) для дій, викликаних через Jquery.Ajax, які не характерні для будь-якої конкретної частини вашої програми. тобто для повторного використання будь-якого з ваших поглядів
Кріс,

Здавайтеся мені правильною відповіддю. CodeIgniter приймає підкаталоги для контролерів, які дозволяють розділити контролери на зони, щоб я міг отримати два контролера сторінки (по одній на зону). Спасибі!
Рушино

Але ви б не закінчилися з дещо великими контролерами, хоча всі дії відносні? Або це не має ніякого питання?
Kid Diamond

4

@Rushino У вас є два "додатки" - передній (для читачів) і бекенд (для адміністраторів). Для кожної групи функцій у вас є контролер.

Увійти в систему - така група, яка включає генерацію HTML форми (поля, що викликає перегляд) та обробку форми (перевірка, з'єднання з моделлю). Отже, "login" - це контролер з двома діями - createForm та handleForm.

Сторінки поділяються між додатком на передньому кінці - який відображає лише сторінки - та додатковою програмою, яка дозволяє редагувати, видаляти, створювати та, можливо, переглядати їх по-іншому. Домашня сторінка - це "лише інша сторінка", щонайменше, на лицьовій стороні, тому вписується в контролер сторінок. На бекенді його логіка може бути досить різною, що виправдовує наявність цілком іншого контролера.

Для користувачів - якщо користувачі можуть зареєструватися самостійно, їм знадобиться контролер інтерфейсу, але якщо ні, то все, що стосується користувачів, просто йде в сервісному центрі.

Зауважте, що кожна з функцій доповнення може вимагати і генератора, і обробника. Ці речі можна розділити на конфігураційні файли, але плагін, який є генератором форм.

Підсумовуючи це, це виглядає приблизно так:

Frontend
  Pages
    View, Handle
  Login
    View, Handle
  Users
    Register (note that the handler can be the same as 'create' on the backend)
  Contact
    View
    Handle

Backend
  Users
    Create, Delete, Edit, Update, View
  Pages
    Create, Delete, Edit, Update, View

Зачекайте .. ваша приказка, що один розділ представляє одну програму? цікавий спосіб зробити це (і, напевно, спосіб зробити це). Цікаво, чи кодинайтер зробить це так .. перевіримо. Я повинен бути впевнений, що ви можете переходити з однієї програми в іншу, не порушуючи жодного сеансу чи стану з'єднання.
Рушино

1
@Rushino CodeIgniter може це зробити так - ви можете помістити папки всередині каталогу Controllers. Відмінність "додатків" відбувається не на рівні бази даних / моделі, а на рівні контролера / перегляду. Причина розлуки полягає в тому, що ваш бекенд робить дуже різні речі, часто із зовсім іншим дизайном. Це допомагає в безпеці, оскільки ви можете обмежити IP-адресу всієї резервної каталоги. І це допомагає в розвитку, тому що ви можете працювати над бекендом, не впливаючи на інтерфейс.
Ден Удар

2

Я думаю, ви повинні використовувати контролер на бізнес-одиницю, як OrdersController для всіх операцій, пов’язаних із замовленнями тощо. Я знаю, що в цьому випадку контролери отримують ВЕЛИЧЕЗНО, але ми все ще можемо використовувати допоміжні класи для делегування таких речей, як ініціалізація моделі та часткові класи для розповсюдження дій в окремих файлах.

Наприклад, у мене можуть бути Create.cs and OrdersControllerфайли OrdersController List.cs для класу OrdersController, кожен з відповідним набором дій. Робить речі набагато чистішими, а операції з замовленнями централізуються в одному класі контролера.

Всього мої 2 копійки.


0

Я думаю, що ви можете скористатися іншим підходом:

Один основний контролер як вхідні двері, який доставляє запит до конкретних контролерів. Таким чином, ви можете використовувати цей передній контролер для перевірки звичайних речей, таких як автентифікація користувачів, аналітики Google та будь-які інші загальні речі, які ви хочете зробити, і зберегти структуру MVC чистою.

Це не моя ідея, але Symfony Framework працює таким чином, тож я можу вам сказати, що, на моєму досвіді, це дійсно приємний та елегантний спосіб втілити фронтенд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.