Translate
Эта версия фреймворка устарела, воспользуйтесь HLEB2

PHP Микрофреймворк HLEB

Скачать Скачать с GitHub
Предназначение Установить Настройка Структура проекта Маршрутизация Типы маршрутов Группы маршрутов Защита маршрутов Конструктор страниц Контроллеры Модели Получение данных Базы данных Регистрация API DI Дополнительно

Маршрутизация

Маршрутизация - это первостепенная задача фреймворка по обработке входящего запроса. Здесь определяется какой именно маршрут отвечает за данный адрес и назначаются дальнейшие действия.

Маршруты проекта составляются разработчиком в файле "/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');




Предназначение Установить Настройка Структура проекта Маршрутизация Типы маршрутов Группы маршрутов Защита маршрутов Конструктор страниц Контроллеры Модели Получение данных Базы данных Регистрация API DI Дополнительно



Группа поддержки в Телеграм - @phphleb

Задать вопрос в блоге, который сделан с использованием фреймворка HLEB.

Этот сайт-инструкция к фреймворку HLEB сделан с использованием фреймворка HLEB.

HLEB - PHP Микрофреймворк Свободная лицензия. Без гарантий. © Foma Tuturov 2019-2024