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