Найти в Дзене

Простой ротинг для CMS

Продолжаю работать над своей учебной CMS.

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

В соответствии с моим с техническим заданием у меня всего 3 модуля: Панель управления, сайт и блог. А также должна быть возможность дописать при необходимости ещё модули. Я решил что все маршруты будут храниться в базе данных MySQL. Через PhpMyAdmin с создал таблицу cms_route. Теперь заполнил её тестовыми данными чтоб протестировать работу нового класса.Много читал о роутинге на основе регулярных выражений. Но во первых мне кажется такой подход сложней в реализации. В этих «регулярках» без пол литра не разобраться. Во вторых у меня есть идея как сделать так, чтоб решение соответствовало требованиям и задачам моей CMS. Супер навороченный роутер мне на данном этапе не нужен. Он просто должен учитывать всё что нужно мне, не больше и не меньше.

Мне нужно было написать раутер для которого есть всего несколько условий.

скриншот экрана моего ноутбука
скриншот экрана моего ноутбука

Так же создал в папке публик создал папки соответствующие названиям модулей и в них классы контроллеров (да я буду стараться придерживаться MVC).

Например: blog/Controller.class.php.

В каждом классе есть метод startApp(). И дополнительно в класе pages/Controller.class.php добавил метод sitemap, а в классе blog/Controller.class.php добавил метод tags().

Работать всё это вместе должно следующим образом:

В целом ничего сверх сложного. А раз так, то и городить космический корабль не стоит. Да и не справлюсь я на текущем уровне с чем то действительно сложным, если вообще когда-нибудь справлюсь.mysite/ — вызовет blog\Controller::startApp()
mysite/tags — вызовет blog\Controller::tags()
mysite/post-o-tovare — вызовет blog\Controller::startApp()
mysite/pages — вызовет pages\Controller::startApp()
mysite/abot — вызовет pages\Controller::startApp()
mysite/pages/sitemap — вызовет pages\Controller::sitemap()
mysite/pages-invent — вызовет pages\Controller::startApp()

В этот раз я впервые попробовал использовать тернарный оператор. Получилось, работает. Запись получается сильно короче чем обычная конструкция if() {…} else {…}. Но мне пока такой код писать сложнее. Вероятно нужно больше опыта.

Теперь при простом запросе он возвращает простой массив, а не многомерный как раньше.Пока писал этот класс попутно пришлось немного изменить класс для работы с базой данных MySQL. А точнее метод select.

В кслассе получилось 3 приватных метода, 1 публичный (статический) и конструктор.

  • public bootstrap() — инициализирует класс
  • private loadingApp() — делает всю основную работу
  • private defaultApp() — спрашивает в базе какой модуль загружать по умолчанию
  • private searchApp() — спрашивает в базе какой модуль должен загрузитсья на основе URL

Этот метод делает следующее:Чуть подробней о loadingApp. Проестировал его как мог, на первый взгляд всё работает как надо.

Сначала устанавливается переменная в которой хранятся параметры для загрузки по умолчанию

После чего проверяю если текущий URL соответствует значению по умолчанию, загружаю нужный метод необходимого класса. В данном случае это будет blog\Controller::startApp(). То есть по сути главная страница.

Ну и сам код класса:Если в URL после домена есть ещё что-то, тогда ищу есть ли это что-то в базе данных. Предположим нет там такого роута, значит загружаем роут по умолчанию. Но предворительно проверим может это имя метода такое. Тогда нужно загружать метод по умолчанию или тот который указан в адресной строке.

Сегодня я активно задействовал ранее написанные мной классы UrlParse, DatabaseMysql и конечно за загрузку самих классов отвечает Autoloader.

Надеюсь получилось неплохо.

Продолжение следует…

Если понравилась статья, поставьте, пожалуйста, лайк!

Если Вы интересуетесь программированием на PHP и созданием сайтов — подписывайтесь, и комментируйте материал. Будем учитсья вместе.

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