11.09.2020

Метки: , ,

Автор: Misterzym

1 Star2 Stars3 Stars4 Stars5 Stars
Загрузка...

Простой и быстрый роутинг

Все мы (веб-разработчики) иногда пишем какие-то инструменты или да же мини-CMS для мелких нужд. Роутинг в них, не то что головная боль — скорее рутина, на которую при этом не хочется тратить много времени. Открыл для себя интересную библиотеку, создающую простые функции, определения роутов и действий с ними. Создал на ней уже пару проектов, в том числе не только для себя — готов теперь поделиться и с вами.

Скачать (ссылка на офиц. GitHub) в конце статьи будет, а сейчас сразу переходим к настройке

Отлично, после манипуляций с настройкой веб-сервера, подключением библиотеки, мы готовы начинать. Следите за действиями, двигаемся быстро!

Создаем маршруты:

  • $method — метод, или список методов этого запроса. Поддерживаются GET|POST|PATCH|PUT|DELETE
  • $route — шаблон маршрута для сопоставления.
    Это может быть обычная строка, один из предопределенных фильтров регулярных выражений или настраиваемое регулярное выражение. Пользовательские регулярные выражения должны начинаться с @.
  • $target — это может быть что угодно, анонимная функция, или функция из класса.
  • $name — для обратной маршрутизации, укажите параметр имени, чтобы вы могли сгенерировать URL-адреса, используя этот маршрут.

Список стандартных типов данных для строк
    1. * — Любой адрес
      [i] — Поиск цифры
      [i:id] — Цифра будет передана как аргумент ‘id’
      [a:action] — Буквенно-цифровое будет передана как аргумент ‘action’
      [h:key] — HEX будет передана как аргумент ‘key’
      [:action] — Что угодно между двумя / передаст в ‘action’
      [create|edit:action] — Совпадение с create или edit передаст в ‘action’
      [*] — Любое совпадение между /
      [*:trailing] — Любое совпадение между / передаст в ‘trailing’
      [**:trailing] — Любое совпадение между / и следующим / в trailing

Все эти снипеты соответствуют этим регулярным выражениям:

    1. ‘i’ => ‘[0-9]++’
      ‘a’ => ‘[0-9A-Za-z]++’
      ‘h’ => ‘[0-9A-Fa-f]++’
      ‘*’ => ‘.+?’
      ‘**’ => ‘.++’
      » => ‘[^/\.]++’

Но что, eсли нам надо проверить какие-то кастомные данные, например сделать роутинг по датам, /store/22.05.2020/ и /store/23.05.2020/ и т.д. ?! Создадим новый тип проверки валидации, и сделаем роутинг к нему!

Все это хорошо. Мы создаем роуты, быстро и просто, да же с своими снипетами регулярных выражений. Но когда и как они начнут обрабатываться? Прямо сейчас!

Если нам вернут массив из 3 элементов, то все хорошо, маршрут найден. Если нет — пора отдать 404, запрошенного адреса не существует! В классе нет как таковой обработки запросов. Сейчас он просто определил маршрут и подготовил данные для дальнейшего использования. На выходе, в $match, мы получили:

  1. target — объект который был указан в $target роута. Если это был класс с функцией — вернет экземпляр класса, если анонимная функция — результат ее выполнения (если он был), в других случаях просто вернет то что там было указано
  2. params — список параметров найденных по регулярным выражениям и снипетам.
  3. name — указанное имя роута, если оно было.

Дальше мы вольны делать с всем этим что угодно. Покажу для примера свою, вроде как универсальную обработку (для себя так решил). Сразу оговорюсь, я не хочу подключать все классы контроллеров, что бы он сам создавал и вызывал классы. И все контроллеры храню в одной папке. А в качестве $target указываю array(‘ControllerName’,’functionName’).

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

Теперь осталась мелочь — вывод в интерфейс адресов по именам роутов (помните в начале обещали), и отладка.

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

Скачать библиотеку
  • Размер: 10,3 KB
  • Скачиваний: 3
  • Комментарии VK