IO v7. Route и работа с ними
Описание
Route (класс маршрутов) - это обработчик URL ссылок (ранее controller). Здесь также используются вызовы class, api (ранее model) и template (ранее view). Route вызывается в браузере в строке URL.
Различные вариации URL называют маршрутами. В данной версии фреймворка автоматическая регистрация маршрутов невозможна по причине отделения backend от frontend и внедрения Vue3. Каждый маршрут нужно регистрировать вручную, но уже под любым именем и путем. Причем регистрировать нужно как сами маршруты, так и классы маршрутов (route). Маршруты регистрируются в классе маршрута, а классы маршрутов регистрируются в модуле (для проекта в файле project/src/app/Module.php, для модуля в файле project/modules/<modulename>/php/Module.php). При регистрации маршрутов можно использовать regexp выражения.
Содержимое файла
В проекте:
<?php
namespace App\Routes;
use IO\Route;
class ExampleRoute extends Route
{
/**
* Регистрация маршрутов
*/
public static function routes($app)
{
$app->add_route([
'type' => ['get', 'post'],
'url' => '/example',
'name' => 'app:example',
'method' => 'actionExample',
]);
}
/**
* Example маршрут
*/
public function actionExample()
{
$this->render('@app/example.twig');
}
}
В модуле (например: trade):
<?php
namespace BMC\Trade\Routes;
use IO\Route;
class ExampleRoute extends Route
{
/**
* Регистрация маршрутов
*/
public static function routes($app)
{
$app->add_route([
'type' => ['get', 'post'],
'url' => '/trade/example',
'name' => 'trade:example',
'method' => 'actionExample',
]);
}
/**
* Example маршрут
*/
public function actionExample()
{
$this->render('@trade/example.twig');
}
}
Route выше обрабатывает ссылку "site.kz/example".
Файлы route'ов проекта находятся в папке project/src/app/Routes, а модуля в папке project/modules/<modulename>/php/Routes. Имя файла должно начинаться с большой буквы и иметь постфикс Route.php (пример: ExampleRoute.php). Имя класса должно быть таким же, как и название файла, без формата файла .php (пример: ExampleRoute).
Регистрация классов маршрутов
Для того, чтобы маршруты были определены фреймворком и задействованы, их классы нужно регистрировать.
В проекте, регистрация классов маршрутов осуществляется в файле project/src/app/Module.php в функции init(), используя функцию $app->add_routes().
В модуле, регистрация классов маршрутов осуществляется в файле project/src/modules/<modulename>/php/Module.php в функции init(), используя функцию $app->add_routes().
public static function init($app)
{
// Регистрация маршрутов
$app->add_routes([
\App\Routes\TestRoute::class,
\App\Routes\DefaultRoute::class,
]);
}
В функции init() вызывается функция $app->add_routes(), в которой указывается массив регистрируемых классов маршрутов проекта.
Методы, обязательные для объявления
routes()
static routes(object(IO\App) $app): void
Данная функция позволяет регистрировать маршруты.
public static function routes($app)
{
$app->add_route([
'type' => ['get', 'post'],
'url' => '/example',
'name' => 'app:example',
'method' => 'actionExample',
]);
}
В данной функции вызывается функция $app->add_route(), в которой указывается один регистрируемый маршрут. Сколько регистрируется маршрутов, столько и будет вызовов этой функции с разными параметрами.
У функции $app->add_route() имеется один единственный и обязательный аргумент, в который обязательно передается массив параметров маршрута. Он содержит параметры:
type: (array string) массив разрешенных методов (GET, POST, PUT, DELETE, OPTIONS и др.) маршрута (пример:['get']если разрешен один, или[get, 'post']если разрешено несколько). По умолчанию:['get'].url: (string) маршрут в виде строки (пример:'/news/:id/images', где:idэто получаемый параметр).match: (string) маршрут в виде regexp правила (пример:/\/news\/(?<id>.*)/i, гдеidэто получаемый параметр).name: (string) имя маршрута для использования в других участках проекта (пример:app:news:item:images)...method: (string) функция, обрабатывающая маршрут (пример:actionNewsItemImages).
Все параметры, кроме type обязательны для заполнения. Параметры url и match использовать совместно нельзя, можно использовать что-то одно.
Методы, необязательные для объявления
actionName()
Функция, обрабатывающая маршрут. Все обработчики маршрутов пишутся по подобию данной функции, начиная с префикса action и далее через CamelCase.
public function actionName()
{
// $this->args['name'] будет работать если маршрут зарегистрировали с параметром:
// - url, где используется ':name'
// - match, где используется '<name>'
$name = $this->args['name'] ?? '';
$this->render('@app/example.twig', [
'name' => $name,
]);
}
init()
Функция, выполняющаяся перед вызовом маршрута (в IO6 называлась run_pre()).
static init()
public static function init()
{
// ...
}
after()
Функция, выполняющаяся после вызова маршрута (в IO6 называлась run_post()).
static after()
public static function after()
{
// ...
}
Доступные функции
render()
render(
string $template,
array $params = [],
int $httpCode = 200
)
Функция отрисовывает указанный template файл, передавая в него параметры из $params.
| Аргумент функции | Тип | Описание | Обязательный |
|---|---|---|---|
$template | string | Путь к template файлу. | Да |
$params | array | Массив параметров, передаваемых в указанный template файл. | Нет |
$httpCode | int | Код состояния HTTP (см. список). | Нет |
В аргументе $path для того чтобы указать, откуда брать файл шаблона, в начале указывается переменная, начинающаяся со знака @ (например @app). Где app это название модуля, которое указывается в функции module_name() в файле:
project/src/app/Module.php- для проекта.project/src/modules/<modulename>/php/Module.php- для модуля.
Пример:
public function actionExample()
{
$name = xget('name');
$age = 25;
$this->render('@app/example.twig', [
'name' => $name,
'age' => $age;
], 200);
}
json()
json(
array $params = [],
int $httpCode = 200
)
Функция возвращает json, состоящий из переданных параметров $params.
| Аргумент функции | Тип | Описание | Обязательный |
|---|---|---|---|
$params | array | Массив параметров, для отображения в формате json. | Нет |
$httpCode | int | Код состояния HTTP (см. список). | Нет |
Пример:
public function actionExample()
{
$name = xget('name');
$age = 25;
$this->json([
'name' => $name,
'age' => $age;
], 200);
}