BMC IO DocsBMC IO Docs
IO v6
IO v7
Notes
Docs
IO v6
IO v7
Notes
Docs
  • IO Framework v7

    • О фреймворке
    • Что изменилось в 7 версии
    • Структура
    • Доступ к участкам проекта
    • Разворачивание нового проекта
  • Backend

    • Настройки проекта Conf.php
    • Настройки модуля Module.php
    • Настройки composer
    • Функции фреймворка
    • Глобальные переменные
    • Константы фреймворка
    • Event класс
    • IOCore класс
    • Route и работа с ними
    • Class и работа с ними
    • Api model и работа с ними
    • Template и работа с ними
    • Мультиязычность и словарь фраз
    • Bin скрипты и работа с ними
    • Cron скрипты и работа с ними
    • $ioSession и работа с сессией
    • $ioHash и работа с кешем
    • $iodb и работа с базой данных
  • Frontend

    • Twig шаблонизатор и работа с ним
    • Twig функции
    • Twig фильтры
    • Twig контекст
    • Настройка NPM
    • Сборка Frontend составляющей
    • Обращение к Api через JS

IO v7. Route и работа с ними

  • Описание
  • Содержимое файла
  • Регистрация классов маршрутов
  • Методы, обязательные для объявления
    • routes()
  • Методы, необязательные для объявления
    • actionName()
    • init()
    • after()
  • Доступные функции
    • render()
    • json()

Описание

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.

Аргумент функцииТипОписаниеОбязательный
$templatestringПуть к template файлу.Да
$paramsarrayМассив параметров, передаваемых в указанный template файл.Нет
$httpCodeintКод состояния 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.

Аргумент функцииТипОписаниеОбязательный
$paramsarrayМассив параметров, для отображения в формате json.Нет
$httpCodeintКод состояния HTTP (см. список).Нет

Пример:

public function actionExample()
{
    $name = xget('name');
    $age = 25;
    
    $this->json([
        'name' => $name,
        'age' => $age;
    ], 200);
}
Prev
IOCore класс
Next
Class и работа с ними