Всем добрый день!
Вопрос к знатокам паттерна 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
У вас роутинг может быть даже sitename.com/1234, но это же не значит, что под каждый ид вы будете писать новый контроллер.
Может быть я дам плохой совет, но я бы посоветовал вам изучить основы фреймворка Laravel, он как раз модель MVC использует. А имея для лары кучу туториалов, вы сможете быстрее понять, как устроено это разделение. Но это мое мнение. Может быть другие скажут иначе.
Ответы:
К сожалению, плохих статей в интернете куда больше чем хороших.
Вот эта, например, вводит совершенно ненужную конструкцию, завязывая зачем-то внутреннюю структуру приложения на структуру НТТР запроса. Хотя разумеется они вообще никак не связаны.
Вам надо просто уйти от этой дурацкой схемы имя/действие/операнд. В реальности так никто не делает.
Если бы адресация любого приложения могла вписываться в эту схему, то отдельный роутинг был бы просто не нужен. Да, для некоторых контроллеров это годится. Для других - нет. И при этом внутренняя структура приложения может вообще ничего общего не иметь с порядком ключевых слов в НТТР запросе.
В данном случае notebooks_and_computers/notebooks - это просто SEO мусор, который вообще не нужен для отображения товара. Для которого нужен только айди товара. Ну вот и запускается контроллер витрины с экшеном отображения карточки товара.
- Спасибо за ответ!
Я привёл ссылку просто для примера. Если бы она имела вид sitename.com/shop/notebooks_and_computers/notebooks/, то были бы отображены все модели ноутов. Это поведение ведь явно обрабатывает какой-то контроллер, передающий виду данные, сгенерированные моделью. При этом учитывается, что если ссылка заканчивается id товара, то выдаётся карточка товара, а в противном случае - список всех товаров категории.
Вы не могли бы подсказать, как именно делают в реальности? Просто в этой статье на хабре я впервые увидел практический пример с пояснениями. Остальные материалы просто в сотый раз пережёвывали общие слова про mvc 🙁 Может, есть некие источники (на английском, русском - неважно), с которыми можете порекомендовать ознакомиться?
- Да не контроллер же
Ну вам же написали уже несколько раз. За работу со ссылками отвечают не контроллеры.
За это отвечает роутинг.
Именно в настройках роутинга прописывается, какой контроллер вызывать для той или иной сылки.
А уж как оно там внутри организовано - да как угодно
может быть один контроллер и на каталог и на товар
может быть два контроллера, один на показ каталога, а один на карточку товара.
Может быть еще как-то.
Деление не контроллеры в принципе условно. и совершенно не принципиально.
Для себя сделайте один пока, который отвечает за отображение каталога и отдельных товаров
Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.
Оставить комментарий Отменить
Ответы
- Есть ответ! к записи Как уменьшить масштаб меньше 100% в Windows 10 (22H2)
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Как называется человек, который дизайн придумает для сайта и сверстает его?
- Есть ответ! к записи Можно ли установить Яндекс.Диск на АльтЛинукс?
- Есть ответ! к записи Картинки мутные только на сафари, есть выход?
- Есть ответ! к записи Keenetic. Как настроить SSTP клиент с сертификатом?
- Есть ответ! к записи Чем заменить executor в aiogram 3?
Для организации системы контроллеров в MVC паттерне следует придерживаться следующих принципов:
1. Каждый контроллер должен быть ответственен за обработку конкретного запроса от пользователя. Не стоит делать один контроллер, который будет обрабатывать все возможные запросы, так как это может привести к перегруженности и сложности в поддержке кода.
2. Контроллеры должны быть легко переиспользуемыми. Это означает, что они должны быть независимыми от конкретной реализации модели и представления. Они должны просто получать данные из модели, обрабатывать их и передавать их в представление.
3. Контроллеры должны быть легко тестируемыми. Это означает, что они должны иметь четко определенные входные данные и выходные данные, чтобы можно было легко написать тесты на их функциональность.
4. Контроллеры должны быть легко расширяемыми. Это означает, что они должны быть способны обрабатывать новые типы запросов без необходимости изменения существующего кода.
Пример организации контроллеров на языке PHP:
Таким образом, правильная организация системы контроллеров в MVC паттерне поможет сделать приложение более структурированным, легким в поддержке и расширении.