Маршрутизация - это первостепенная задача фреймворка по обработке входящего запроса. Здесь определяется какой именно маршрут отвечает за данный адрес и назначаются дальнейшие действия.
Маршруты проекта составляются разработчиком в файле
"/routes/main.php", в этот файл могут быть вставлены (инклюдированы) другие файлы с маршрутами из папки
"routes", которые вместе и составят карту маршрутизации.
Особенностью данных маршрутов стоит считать, что при их загрузке идёт проверка фреймворком на общую правильность и последовательность использованных методов, в случае исключения генерируется ошибка
с указанием причины исключения. Так как в карте маршрутов проверке подвергаются все существующие там маршруты, это гарантирует их общую корректность. Если после проведенных изменений в карте маршрутизации
фреймворк не сгенерировал характерных сообщений, то в дальнейшем эти сообщения не будут появляться, по крайней мере до следующих изменений в подключенных файлах маршрутов.
Маршруты определяются методами класса
Route, основным из которых является
get(). Все методы этого класса доступны и используются только в карте маршрутизации.
Внимание! Файлы маршрутов кэшируются и не должны содержать никакого использующего внешние данные кода. В идеале там могут находиться только методы класса
Route и комментарии к маршрутам.
Метод get()
Следующий маршрут выведет при обращении к корневому
URL сайта строчку
"Hello, world!".
Route::get('/', 'Hello, world!');
Однако, чтобы не загромождать карту роутов html-кодом , можно указать путь к файлу из папки
"views", в примере файл
"/views/index.php" содержит индексную страницу приложения.
Он указан как целевой при помощи функции
view().
Route::get('/', view('index'));
Функция view()
Имеет два параметра, первый из которых обязателен, он указывает на файл в папке
"views" проекта, второй представляет собой массив с данными, который можно использовать в
PHP-коде вставляемого файла.
Этот массив будет доступен в файле из функции
data(), которая возвращает сам массив или конкретное значение по ключу, например data(0) вернет значение по ключу 0. Но все ключи типа
string этого массива дополнительно
преобразуются в переменные, поэтому необходимо при их назначении учитывать правила именования переменных в PHP. Например:
Route::get('/map/', view('/maps/new', ['x' => 59.9, 'y' => 30.3]));
Здесь при открытии условного адреса
"site.com/map/" будут отображены данные из
"/views/maps/new.php", в который переданы переменные
$x и
$y с соответствующими значениями, пользоваться ими удобнее, чем функцией
data().
Предполагается, при создании упомянутого кода, что правила его удобочитаемости и дальнейшей поддержки основаны на замысле работающего с ним программиста.
// Файл /views/maps/new.php
<?php
/** @var float $x */
/** @var float $y */
var_dump($x); // float(59.9)
var_dump($y); // float(30.3)
Именованные маршруты
Присваивание маршруту уникального названия необходимо для дальнейшего получения адреса маршрута по названию маршрута.
Route::get('/', 'Домашняя страница')->name('home');
После того, как название маршрута (
"home") назначено, можно его получить:
// Файл /views/test.php
<?= getUrlByName('home'); ?> // Выводит "/"
Подробнее о получении адреса маршрута в разделе «
Получение данных».
Динамические адреса
Микрофреймворк
HLEB обрабатывает произвольные адреса по заданной разработчиком сайта схеме, например:
Route::get('/ru/{version}/{page}/', 'Использован динамический адрес.');
В указанном случае все адреса
URL, отвечающие условной схеме
"site.com/ru/.../.../" будут отдавать одинаковую текстовую строчку, а значения "version" и
"page" становятся доступны из объекта
Hleb\Constructor\Handlers\Request: Request::get("version") и
Request::get("page").
Приведенный пример не позволяет его использовать, но, после ознакомления с контроллерами, станет понятным полезность этого объекта.
Из этого следует, что при обращении к адресу
"/ru/v1/routes/", Request::get("version") будет отдавать строку
"v1", а
Request::get("page") - "routes";
К динамическим адресам допустимо добавлять условия по регулярному выражению при помощи метода
where().
Метод where()
Используется после метода
get(), добавляя проверку по регулярному выражению к нужным элементам динамического адреса.
Route::get('/ru/{version}/{page}/', 'Дополнительная проверка динамического адреса.')->where(['version' => '[a-z0-9]+', 'page' => '[a-z]+']);
Таким образом, область допустимых адресов сужается после проверки значения
"version" на содержание только латинских букв и цифр, а
"page" проверяется на наличие только латинских букв.
Стоит обратить внимание, что метод
where() принимает единственный аргумент в виде массива.
Составление карты маршрутов
Методы класса
Route сделаны максимально комбинируемыми, так что составлять их можно в любом порядке,
главное, чтобы их последовательность не нарушала условия применения самих методов, например, метод
where() должен идти после существующего метода
get(), к которому и будет применён.
В итоге последовательность такого вида:
Route::prefix('/ru/{version}/')->getGroup()->get('/', 'Только версия.')->get('/{page}/', 'Версия со страницей.')->where(['page' => '[a-z]+'])->endGroup()->where(['version' => '[a-z0-9]+']);
Полностью соответствует:
Route::prefix('/ru/{version}/');
Route::getGroup();
Route::get('/', 'Только версия.');
Route::get('/{page}/', 'Версия со страницей.')->where(['page' => '[a-z]+']);
Route::endGroup();
Route::where(['version' => '[a-z0-9]+']);
Как видно второй вариант более читабелен, но выбор компоновки маршрутов остается за разработчиком сайта. Также нужно знать, что при наличии двух совпадающих адресов в карте маршрутов, использован будет первый
подходящий под
URL, остальные игнорируются.
В этом примере можно заметить также применение группировки и добавления префикса.
Про
группы маршрутов есть отдельный раздел инструкции. Метод
prefix() применяется к группам, вычленяя общее
начало у сгруппированных адресов. Здесь при соединении
prefix("/ru/{version}/") и
get("/", ...) получается искомый адрес
"/ru/{version}/", а при соединении
prefix("/ru/{version}/") и
get("/{page}/", ...) получается
"/ru/{version}/{page}/".
Далее у метода
get(), имеющего в адресе
"{page}" уточняется допустимое содержание при помощи метода
where(), а у группы адресов проверяется таким же образом параметр
"{version}".
Фреймворк поддерживает вариативное присвоение маршрута, если конечная часть адреса отсутствует:
Route::get('/example/{page?}/', 'Последняя часть URL не обязательна.');
// или так
Route::get('/example/page?/', 'Последняя часть URL не обязательна.');
Множественное назначение маршрутов (в
Request::get() окажется нумерованный массив с частями URL):
Route::get('/example/...0-5/', 'От 0 до 5 произвольных частей.');
// или так
Route::get('/example/...1-3,7,9,11-20/', 'Количество частей в установленном диапазоне.');
Метод fallback()
Позволяет обработать все несовпавшие маршруты по всем HTTP-методам. Может быть вызван только один раз и находиться в любом месте файла маршрутов.
Route::fallback( view('404'));
// или так
Route::fallback()->controller('FallbackController');