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

Так как мы импортировали переменные из массива запросов в текущую таблицу символов, упростим шаблон hello.php следующим образом:

Теперь добавлять новый функционал будет гораздо удобнее.
Одним из важных аспектов любого сайта это вид его ссылок. Благодаря карте ссылок, мы отделили URL от кода, который генерирует соответствующий ответ, но он все еще недостаточно гибкий. Например, что если мы захотим обрабатывать данные из динамически формируемых путей, вместо параметризированной строки:

Для поддержки этой фичи, мы будем использовать компонент Routing. Как всегда, добавим его в composer.json и обновим зависимости, чтобы установить его:

С этого момента, мы будем использовать сгенерированный Composer’ом автозагрузчик вместо нашего autoload.php. Удалите файл autoload.php и измените ссылку на него в front.php:

Компонент маршрутизации использует экземпляр класса RouteCollection, вместо массива соответствий (карты ссылок).

Давайте добавим маршрут для ссылки вида /hello/SOMETHING и еще один для простой /bye:

Каждый элемент коллекции определяется именем (hello) и экземпляром класса Route, который в свою очередь определяется паттерном роута (/hello/{name}) и массивом дефолтных атрибутов (array('name' => 'World')).

В официальной документации по данному компоненту вы найдете информацию об остальных его функциях, таких как генерация URL, требования к атрибутам, соблюдение HTTP методов, загрузчик YAML или XML файлов, экспорт rewrite rules в PHP или Apache для повышения производительности, и многое другое.

Основываясь на информации, находящейся в экземпляре класса RouteCollection, экземпляр класса UrlMatcher свяжет пути:

Метод match() разделяет запрашиваемый путь на массив (обратите внимание, что совпадающие пути автоматически сохраняются под специальным ключом _route):

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

Если не удается найти совпадение ни с одним путем, кидается исключение:

Теперь используя приобретенные знания, пришло время написать следующую версию нашего фреймворка:

Новые изменения в коде:

  • Имена путей используются для названий шаблонов
  • Ошибка 500 обрабатывается корректно
  • Параметры запроса отделены для сохранения простоты шаблонов

  •  Конфигурация маршрутов была перемещена в отдельный файл:

Мы полностью отделили конфигурацию (все, характеристики нашего приложения — в app.php) и фреймворк (остальной код на котором основано наше приложение – в front.php).

Добавив около 30 строк кода, мы получили новый фреймворк – более производительный, более гибкий, нежели предыдущий. Наслаждайтесь!

У использования компонента маршрутизации есть еще одно большое преимущество: способность генерировать URL-адреса на основе названий Route. При одновременном использовании URL matching и URL generation в вашем коде, изменение шаблона URL не должно быть никаких последствий. Хотите узнать, как использовать генератор? Безумно просто:

Код не требует пояснений, так же мы можем генерировать и абсолютные пути добавив третий параметр true:

Обеспокоены производительностью? Используя ваши определения маршрутов, создадим оптимизированный класс совпадений URL, который заменит дефолтный UrlMatcher:

Хотите еще большей производительности? Экспортируйте ваши маршруты как mod_rewrite правила для Apache: