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

За маршрутизацию отвечает класс Aleksmir/Core/Route/Route. Ссылка из любого места кода доступна через вспомогательную функцию route().

При инициализации объекта класса из адресной строки читается URL. Затем, выполнение программы перенаправляется в соответствии с картой маршрутов, заданной в параметре 'core/route/map'.

Ядро также содержит предопределенную карту маршрутов, маршруты которой начинаются с /core. Маршруты зарезервированы ядром и их переопределять нельзя. Все остальные маршруты, включая маршруты '/' и '/{a1}' можно определять и переопределять.

Предопределенные маршруты ядра

В версии 1.6.25 предопределены маршруты ядра:

public $map_core = [

  '/{a1:(?:core)}/{a2:(?:doc|vers|news|page)}[/{a3}[/{a4}[/{a5}[/{a6}]]]]' => 'a()->core->route->view()',

  '/{a1:(?:core)}[/{a2}[/{a3}[/{a4}]]]' => 'a()->core->route->execute()',

  '/{a1}' => 'a()->core->route->index()',

  '/' => 'a()->core->route->index()'
];

Маска первого маршрута содержит параметры от a1 до a6. Маршрут начинается с прямого слэша, затем следует обязательный параметр a1, который может принимать только одно значение 'core'. Потом прямой слэш и потом следует второй обязательный параметр a2, который может принимать также строго определенные значения: 'doc', 'view', 'news' или 'page'.

Затем идут необязательные параметры a3, a4, a5, a6. Если маска маршрута 'срабатывает', то вызывается метод a()->core->route->view(), которому передаются все заданные параметры от a1 до a6. Если параметров в маршруте меньше, то и в метод передается меньше параметров.

Маска второго маршрута охватывает все маршруты, начинающиеся с '/core'.

Третий и четвертый маршруты обрабатывают вызов главной страницы, т.е.:

'/{a1}' - обрабатывает вызов главной страницы на другом языке , например '/en';
'/' - обрабатывает вызов главной страницы на основном языке.

Синтаксис маршрутов

Маршрутизация фреймворка Aleksmir Core реализована с помощью библиотек:

https://github.com/nikic/FastRoute
https://github.com/artoodetoo/junc

Варианты маршрутов:

'/' - корневой маршрут;

'/{a1}' - один обязательный параметр;

'/{a1}/{a2}' - два обязательных параметра;

'/{a1}[/{a2}]' - один обязательный, один необязательный параметр;

'/name[/{a1}[/{a2}]]' - адрес, начинающийся с /name и имеющий два необязательных параметра;

'/{a1:(?:name1|name2)}' - один обязательный параметр, который может принимать только одно из 2-х значений - 'name1' или 'name2';

'/te{ param }st' - параметр внутри имени;

'/test/{param1}/test2/{param2}' - чередуются имя, параметр, имя, параметр;

'/test/{param:\d+}' - имя, затем параметр, состоящий из одной или нескольких десятичных цифр;

'/test/{ param : \d{1,9} }' - обязательное имя 'test' и обязательный параметр param, который может содержать цифры в количестве от 1 до 9;

'/test[opt]' - один из вариантов '/test' или '/testopt';

'/{param}[opt]' - обязательный параметр param и необязательное имя opt;

'/test[/{name}[/{id:[0-9]+}]]' - необязательное имя 'test', необязательный параметр 'name' из любых символов, необязательный параметр 'id' состоящий хотя бы из одной цифры.