Как правильно организовать систему контроллеров в mvc паттерне?

Всем добрый день!

Вопрос к знатокам паттерна mvc. Прочёл несколько статей и учебных материалов по этому паттерну - в теории всё довольно стройно выходит, но на практике возникают вопросы. Вот, например, цитата из статьи на хабре:

Например: example.ru/contacts/feedback

С помощью функции explode производится разделение адреса на составляющие. В результате мы получаем имя контроллера, для приведенного примера, это контроллер contacts и имя действия, в нашем случае — feedback.

А как быть, если составляющих несколько? Например, такая ссылка:
sitename.com/shop/notebooks_and_computers/notebooks/1234

Т.е., по идее, пользователь должен увидеть страницу с ноутбуком №1234, но что здесь полагать контроллером, а что действием? Или контроллеров может быть несколько вложенных?

Дополнительно:

Могу ошибаться, но по-моему вы путаете роутинг с контроллерами

  • Скорее всего зависит от того как сильно различается вывод и подготовка данных.
    Если между какими нибудь роутами типа. /shop/notebooks_and_computers/notebooks/1234 и /shop/house_keeping/vacuum/321 разницы никакой - то будет какой нибудь контроллер Shop с методом view
  • maksam07, exactly
  • maksam07, всё может быть 🙂 Т.е. в данном случае контроллер - это shop, а что он получает на вход, зависит от дальнейшей строки, которая разбирается роутером?
  • NordNerd, в данном случае, контроллер - что угодно. Хоть назовите его EtoMoyController.
    У вас роутинг может быть даже sitename.com/1234, но это же не значит, что под каждый ид вы будете писать новый контроллер.

    Может быть я дам плохой совет, но я бы посоветовал вам изучить основы фреймворка Laravel, он как раз модель MVC использует. А имея для лары кучу туториалов, вы сможете быстрее понять, как устроено это разделение. Но это мое мнение. Может быть другие скажут иначе.

  • Ответы:

    К сожалению, плохих статей в интернете куда больше чем хороших.
    Вот эта, например, вводит совершенно ненужную конструкцию, завязывая зачем-то внутреннюю структуру приложения на структуру НТТР запроса. Хотя разумеется они вообще никак не связаны.
    Вам надо просто уйти от этой дурацкой схемы имя/действие/операнд. В реальности так никто не делает.
    Если бы адресация любого приложения могла вписываться в эту схему, то отдельный роутинг был бы просто не нужен. Да, для некоторых контроллеров это годится. Для других - нет. И при этом внутренняя структура приложения может вообще ничего общего не иметь с порядком ключевых слов в НТТР запросе.

    В данном случае notebooks_and_computers/notebooks - это просто SEO мусор, который вообще не нужен для отображения товара. Для которого нужен только айди товара. Ну вот и запускается контроллер витрины с экшеном отображения карточки товара.

    • Спасибо за ответ!

      Я привёл ссылку просто для примера. Если бы она имела вид sitename.com/shop/notebooks_and_computers/notebooks/, то были бы отображены все модели ноутов. Это поведение ведь явно обрабатывает какой-то контроллер, передающий виду данные, сгенерированные моделью. При этом учитывается, что если ссылка заканчивается id товара, то выдаётся карточка товара, а в противном случае - список всех товаров категории.

      Вы не могли бы подсказать, как именно делают в реальности? Просто в этой статье на хабре я впервые увидел практический пример с пояснениями. Остальные материалы просто в сотый раз пережёвывали общие слова про mvc 🙁 Может, есть некие источники (на английском, русском - неважно), с которыми можете порекомендовать ознакомиться?

    • Да не контроллер же
      Ну вам же написали уже несколько раз. За работу со ссылками отвечают не контроллеры.
      За это отвечает роутинг.
      Именно в настройках роутинга прописывается, какой контроллер вызывать для той или иной сылки.
      А уж как оно там внутри организовано - да как угодно
      может быть один контроллер и на каталог и на товар
      может быть два контроллера, один на показ каталога, а один на карточку товара.
      Может быть еще как-то.
      Деление не контроллеры в принципе условно. и совершенно не принципиально.
      Для себя сделайте один пока, который отвечает за отображение каталога и отдельных товаров

     

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

     

      • Как правильно организовать систему контроллеров в mvc паттерне?Есть ответ
      • 07.04.2024
      Ответить

      Для организации системы контроллеров в MVC паттерне следует придерживаться следующих принципов:

      1. Каждый контроллер должен быть ответственен за обработку конкретного запроса от пользователя. Не стоит делать один контроллер, который будет обрабатывать все возможные запросы, так как это может привести к перегруженности и сложности в поддержке кода.

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

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

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

      Пример организации контроллеров на языке PHP:

      class UserController {
          public function index() {
              // Выводит список всех пользователей
          }
       
          public function show($id) {
              // Выводит информацию о конкретном пользователе по его ID
          }
       
          public function create() {
              // Отображает форму для создания нового пользователя
          }
       
          public function store() {
              // Сохраняет нового пользователя в базу данных
          }
       
          public function edit($id) {
              // Отображает форму для редактирования существующего пользователя
          }
       
          public function update($id) {
              // Обновляет информацию о пользователе в базе данных
          }
       
          public function delete($id) {
              // Удаляет пользователя из базы данных
          }
      }

      Таким образом, правильная организация системы контроллеров в MVC паттерне поможет сделать приложение более структурированным, легким в поддержке и расширении.

    Оставить комментарий