Найти в Дзене

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

Продолжаю работать над своей учебной 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 и созданием сайтов — подписывайтесь, и комментируйте материал. Будем учитсья вместе.

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