Создание маршрутизатора в собственном фреймворке на PHP. Часть 4

Andre Kowalsy
179 раз
5 мин чтения
Опубликовано: 23-07-2025
Обновлено: 27-03-2026
Категории: Пишем свою CMS
Продолжаем работу над классом Мартшузатора

Сегодня мы продолжаем нашу работу над классом Мартшузатора, который уже почти готов к использованию в нашем проекте. В этом посте я хочу по шагам показать, как добавить важный метод для обработки параметров в URL, что позволит нам более гибко работать с запросами и избежать ошибок, связанных с гет-параметрами.

Текущая ситуация

На данный момент мы можем корректно обрабатывать запросы к страницам с помощью нашего маршрутизатора. Например, при запросе страницы page/view, наш контроллер находит соответствующий метод View без проблем. Однако, если мы попытаемся обратиться к несуществующему действию, например View2, мы получим сообщение об ошибке, что такая страница не найдена.

Но появление гет-параметров, таких как id=1,2,3 или test=test, может привести к ошибкам. Давайте разберемся, почему так происходит.

Проблема с гет-параметрами

В текущей реализации наш маршрутизатор ожидает URL, составленный из контроллера, действия и, возможно, дополнительных сегментов. Гет-параметры, которые следуют после знака ?, игнорируются, так как мы не учитываем их в правилах маршрутизации. Это может привести к тому, что приложение не сможет корректно обработать запрос, и вернет ошибку.

Решение проблемы: Метод RemovQueryString

Чтобы исправить это, мы создадим метод RemovQueryString, который будет отсекать гет-параметры из URL-адреса, оставляя только нужные сегменты. Вот реализация этого метода:

public static function RemovQueryString($url) {
    if (empty($url)) {
        return '';
    }

    $params = explode('&', $url, 2);
    if (strpos($params[0], '=') === false) {
        return rtrim($params[0], '/');
    }

    return '';
}

Как работает метод?

  1. Проверка на пустую строку: Если URL пуст, метод вернет пустую строку.

  2. Сделаем разбиение строки: Метод разделяет строку URL по символу &, ограничивая количество элементов в массиве до двух: первый элемент будет содержать основной адрес, а второй элемент — возможные гет-параметры.

  3. Проверяем наличие гет-параметров: Если в первом элементе массива нет знака =, то это сегменты URL, и мы просто удаляем конечный слэш.

  4. Возврат результата: Если гет-параметры присутствуют, метод возвращает пустую строку, чтобы наши маршруты работали корректно.

Интеграция метода в маршрутизатор

Теперь давайте добавим вызов нашего нового метода в метод Dispatch:

$url = self::RemovQueryString($url);

Это позволит нашему маршрутизатору отсеивать все гет-параметры и работать только с корректным адресом.

Результат

Теперь, если мы сделаем запрос к page/view с добавленными гет-параметрами, например page/view?id=1&test=test, наш маршрутизатор будет правильно обрабатывать этот запрос и находить соответствующий контроллер, благодаря тому, что мы успешно отсекли ненужные параметры.

Заключение

Вот таким образом мы улучшили наш класс Мартшузатора, добавив метод для работы с гет-параметрами. Это простой, но эффективный шаг в разработке, который позволяет избежать множества ошибок и делает наше приложение более устойчивым.

На этом мы завершаем сегодняшний урок. В следующем посте мы продолжим добавлять новые функции и классы в наше приложение. Не забывайте экспериментировать и применять полученные знания на практике! До встречи!