x_Romax
@x_Romax
Говнокодер

Как реализовать роутинг PHP MVC?

Как делать базовый роутинг я понимаю www.example.com/account/login где account - контроллер, login - метод(экшн). Но а как работает вот такая структура например:
https://xatab-repack.net/games/torrent_igry/licenzii/30
и тому подобные, где длинный URI страницы.
  • Вопрос задан
  • 1380 просмотров
Решения вопроса 1
@novrm
В любом большом веб-приложении есть потребность в иерархии...
Пример - интернет магазин - две основные МОДЕЛИ (Model) - Category и Product:

Бытовая техника (Category)
|---------- Холодильники (Category)
__________|__________ Samsung2019 (Product)
|__________ Телевизоры (Category)
____________|__________ Sony2019 (Product)

Как вывести в броузер (придумать единственный URL) переменные ВИДА (View) о Sony2019.
... существует миллион и один способ это сделать - все зависит от фантазии веб-программиста и желания заказчика.

Например так:
market.com/sony2019
market.com/sony2019/
market.com/sony2019.html
market.com/p201569-sony2019.html

Эти варианты - попроще, легко реализуются и веб-программист будет настаивать на таком положении вещей...
Однако заказчик желает иметь УРЛы SEO-правильные, как ему нашептал Лебедев...
... и веб-программист получает головняк:
market.com/Бытовая техника/Телевизоры/sony2019
market.com/Бытовая техника/Телевизоры/sony2019.html

Как это работает...
Все УРЛы съедаются КОНТРОЛЛЕРОМ (Controller) в простейшем случае...
Однако в фреймворках перед КОНТРОЛЛЕРОМ может быть РОУТЕР - куда УРЛы попадают еще раньше...
URL -> ROUTER -> CONTROLLER -> MODEL -> VIEW

Вот в этой цепочке "перетравливается" УРЛ... Как из SEO-URL иерархической цепочки получить искомые ВИДИ - существует миллион и один способ...

Например так...
Задаете для ROUTER
- если URL заканчивается на слеш "/" - то перенаправляй на контроллер CategoryController - ибо получили КАТЕГОРИЮ... Например "market.com/Бытовая техника/Телевизоры/"
- если URL НЕ заканчивается на слеш "/" - то перенаправляй на контроллер ProductController - ибо получили ПРОДУКТ... Например "market.com/Бытовая техника/Телевизоры/sony2019"

Дальше в CategoryController берем часть URL, например "Бытовая техника/Телевизоры" и придумываем алгоритм - извлечь МОДЕЛЬ "Телевизоры", которая является ребенком для МОДЕЛИ "Бытовая техника"... Извлекаем МОДЕЛЬ из БД - передаем ее переменные в ВИД или помощники вида...

Аналогично для МОДЕЛИ "sony2019" Берем часть URL, например "Бытовая техника/Телевизоры/sony2019" и придумываем алгоритм - извлечь МОДЕЛЬ "sony2019", которая является ребенком МОДЕЛИ "Телевизоры", которая является ребенком для МОДЕЛИ "Бытовая техника"... Извлекаем МОДЕЛЬ из БД - передаем ее переменные в ВИД или помощники вида...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
NikkyNick1
@NikkyNick1
Почитайте про паттерн Front Controller (Единая точка входа)

https://www.sitepoint.com/front-controller-pattern-1/
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Роутинг это (в общем случае) сопоставление пути с контроллером/экшном, как это реализовать зависит от конкретной ситуации, или берется что-то готовое(благо их много). Как самый простой вариант - массив вида "/some/path"=>['controller','action']; В более сложном случае разбивают на компоненты по слэшам и используют правила на основе регулярок, где все не указывающие на контроллер / экшн элементы считаются дополнительными параметрами и обрабатываются логикой экшна.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы