Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

Настройка маршрутизации в приложениях PHP с использованием компонента маршрутизации Symfony

by
Difficulty:IntermediateLength:MediumLanguages:

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

Сегодня мы рассмотрим компонент Symfony Routing, который позволяет настраивать маршрутизацию в ваших PHP-приложениях.

Что такое компонент маршрутизации Symfony?

Компонент Symfony Routing - очень популярный компонент маршрутизации, который используется несколькими фреймворками и обеспечивает большую гибкость, если вы хотите настроить маршруты в своем PHP приложении.

Если вы создали собственное приложение PHP и ищете многофункциональную библиотеку маршрутизации, компонент Symfony Routing Component выглядит более чем заслуживающим внимания. Он также позволяет вам определять маршруты для вашего приложения в формате YAML.

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

  • установка и настройка
  • как настроить основные маршруты
  • как загружать маршруты из файла YAML
  • как использовать маршрутизатор «все-в-одном»

Установка и настройка

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

После того, как вы установили Composer, перейдите и установите основной компонент Routing, используя следующую команду.

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

Для начала мы добавим компонент HttpFoundation, который предоставляет объектно-ориентированную оболочку для глобальных переменных PHP и функций, связанных с ответом. Он гарантирует, что вам не нужно напрямую обращаться к глобальным переменным типа $ _GET, $ _POST и т.п.

Затем, если вы хотите определить маршруты приложений в файле YAML вместо PHP кода, то понадобится компонент YAML, поскольку он помогает вам преобразовывать строки YAML в PHP массивы и наоборот.

Наконец, мы установим компонент Config, который предоставляет несколько утилитных классов для инициализации и обработки значений конфигурации, определенных в разных типах файлов, таких как YAML, INI, XML и т.д. В нашем случае мы будем использовать его для загрузки маршрутов из файла YAML.

Итак, это часть установки, но как вы должны ее использовать? Фактически нужно всего лишь подключить файл autoload.php, созданный Composer в вашем приложении:

Настройка основных маршрутов

В предыдущем разделе мы рассмотрели установку необходимых компонентов маршрутизации. Теперь вы готовы настроить маршрутизацию в своем PHP приложении.

Давайте продолжим и создадим файл basic_routes.php со следующим содержимым.

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

  • Инициализируйте объект Route для каждого маршрута вашего приложения.
  • Добавьте все объекты Route в объект RouteCollection.
  • Инициализируйте объект RequestContext, который содержит текущую информацию контекста запроса.
  • Инициализируйте объект UrlMatcher, передав объект RouteCollection и объект RequestContext.

Инициализировать объект маршрута для разных маршрутов

Давайте продолжим и определим довольно простой маршрут foo.

Первым аргументом конструктора Route является путь URI, а второй аргумент - это массив настраиваемых атрибутов, которые вы хотите вернуть, когда этот конкретный маршрут будет сопоставлен. Как правило, это будет комбинация контроллера и метода, которые вы хотите вызвать, когда запрашивается этот маршрут.

Затем давайте посмотрим на параметризованный маршрут.

Вышеуказанный маршрут может соответствовать URI, например, foo/1, foo/123 и тому подобное. Обратите внимание, что мы ограничили параметр {id} только числовыми значениями, и, следовательно, он не будет соответствовать URI, например foo/bar, поскольку параметр {id} предоставляется в виде строки.

Добавьте все объекты маршрута в объект RouteCollection

Следующий шаг - добавить объекты маршрута, которые мы инициализировали в предыдущем разделе в объект RouteCollection.

Как вы можете видеть, это довольно просто, поскольку вам просто нужно использовать метод add объекта RouteCollection для добавления объектов маршрута. Первым аргументом метода add является имя маршрута, а второй аргумент - сам объект маршрута.

Инициализация объекта RequestContext

Затем нам нужно инициализировать объект RequestContext, который содержит текущую информацию контекста запроса. Нам понадобится этот объект, когда мы инициализируем объект UrlMatcher.

Инициализация объекта UrlMatcher

Наконец, нам нужно инициализировать объект UrlMatcher вместе с маршрутами и контекстной информацией.

Теперь у нас есть все, что можно было бы сопоставить нашим маршрутам.

Как сопоставлять маршруты

Это метод match объекта UrlMatcher, который позволяет вам сопоставлять любой маршрут с набором предопределенных маршрутов.

Метод match принимает URI в качестве первого аргумента и пытается сопоставить его с предопределенными маршрутами. Если маршрут найден, он возвращает пользовательские атрибуты, связанные с этим маршрутом. С другой стороны, он выдает исключение ResourceNotFoundException, если нет маршрута, связанного с текущим URI.

В нашем случае мы предоставили текущий URI, извлекая его из объекта $context. Таким образом, если вы обращаетесь к URL http://your-domain/basic_routes.php/foo, $context->getPathInfo() возвращает foo, и мы уже определили маршрут для URI foo, поэтому он должен вернуть нам следующее.

Теперь давайте рассмотрим параметризованный маршрут, обратившись к URL http: //your-domain/basic_routes.php/foo/123.

Он сработал, если вы видите, что параметр id связан с соответствующим значением 123.

Затем попробуем обратиться к несуществующему маршруту, например http://your-domain/basic_routes.php/unknown-route, и вы должны увидеть следующее сообщение.

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

Помимо этого, вы также можете использовать компонент Routing для создания ссылок в своем приложении. Предоставляя объекты RouteCollection и RequestContext, UrlGenerator позволяет создавать ссылки для определенных маршрутов.

Первым аргументом метода generate является имя маршрута, а второй аргумент - это массив, который может содержать параметры, если это параметризованный маршрут. Вышеприведенный код должен генерировать URL-адрес /basic_routes.php/foo/123.

Загрузка маршрутов из файла YAML

В предыдущем разделе мы построили пользовательские маршруты, используя объекты Route и RouteCollection. Фактически, компонент Routing предлагает различные способы, чтобы создавать маршруты. Вы можете выбирать из различных загрузчиков, таких как YamlFileLoader, XmlFileLoader и PhpFileLoader.

В этом разделе мы рассмотрим загрузчик YamlFileLoader, чтобы узнать, как загружать маршруты из файла YAML.

Файл маршрутов YAML

Двигаемся дальше и создаем файл routes.yaml со следующим содержимым.

Файл примера

Затем перейдите к файлу load_routes_from_yaml.php со следующим содержимым.

Единственное, что отличается в этом случае, это то, как мы инициализируем маршруты!

Мы использовали загрузчик YamlFileLoader для загрузки маршрутов из файла route.yaml вместо его инициализации непосредственно в самом PHP. Всё будет тоже самое, и вы должны получить те же результаты, что и с файлом  basic_routes.php.

Маршрутизатор All-in-One

Наконец, в этом разделе мы рассмотрим класс Router, который позволяет быстро настроить маршрутизацию с меньшим количеством строк кода.

Перейдите к файлу all_in_one_router.php со следующим содержимым.

Все почти то же самое, за исключением того, что мы создали экземпляр объекта Router вместе с необходимыми зависимостями.

При этом вы можете сразу использовать метод match объекта Router для сопоставления маршрутов.

Кроме того, для извлечения маршрутов вам понадобится использовать метод getRouteCollection объекта Router.

Заключение

Двигайтесь дальше и исследуйте другие варианты, доступные в компоненте Routing - мне бы хотелось услышать ваши идеи!

В настоящее время мы изучили компонент Symfony Routing, который упрощает реализацию маршрутизации в PHP-приложениях. По пути мы создали несколько примеров, чтобы продемонстрировать различные аспекты компонента Routing.

Я надеюсь, что эта статья вам понравилась, и вы можете написать свои мысли ниже в комментариях!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.