Встроенный роутинг

Оглавление

1. Введение
2. Правила по умолчанию
3. Способы настройки маршрутов
4. Правила маршрутизации
5. Правила построения маски
6. Примеры построения



Введение #
К оглавлению

Встроенная маршрутизация в ABC-фреймворке - это упрощенные правила роутинга популярного фреймворка Yii2.

Чтобы задействовать встроенный роутинг, достаточно просто запустить приложение:
www\index.php
1
2
3
4
5
6
<?php 

    
require __DIR__ .'/../vendor/ABC/ABC.php';     
    
$local = require __DIR__ .'/configs/local.php';          
    
ABC::startApp($local)->run();   




Сам по себе роутинг, это преобразование URI в маршрут. А маршрут - это контроллер и действие (action), которые будут задействованы в формировании страницы.

Нужно отметить, что правила маршрутизации применимы только для Человеко Приятных URI.
Это и логично, ведь роутинг для того и нужен, чтобы преобразовать «зашифрованные» URI в обычные GET-параметры.

По умолчанию действуют такие правила #
К оглавлению

1. Первым всегда идет название контроллера. Если параметра нет, будет задействован дефолтный.

2. Вторым всегда идет название действия (экшена). Если параметра нет, будет задействован дефолтный.

3. Дальше по очереди идут пары имя_параметра/значение.


Примеры:
URL Контроллер Действие GET
http://abc-framework MainController actionIndex - - - -
http://abc-framework/docs DocsController actionIndex - - - -
http://abc-framework/docs/edit DocsController actionEdit - - - -
http://abc-framework/docs/edit/id/5 DocsController actionEdit GET['id'] = 5


Способы настройки маршрутов #
К оглавлению

Изменить дефолтные контроллер и действие можно, изменив в любом из конфигурационных файлов такие настройки:
1
2
3
4
5
6

                    'default_route' => [
                                        
'controller' => 'Main'
                                        
'action'     => 'Index'
                    
],




Если не устраивают дефолтные правила маршрутизации, можно написать свои. Сделать это можно двумя способами.

1. Организовать в любой из конфиг секцию 'route_rules' и в ней прописать эти правила.
1
2
3
4
5
6

            'route_rules' => [ 
                                
'docs/<paragraph>'            => 'docs/index',
                                
'docs/<paragraph>/<section>'  => 'docs/section',
                    ],




2. Прописать их в отдельный файл
1
2
3
4
5
6
7
<?php 

    
return [ 
                
'docs/<paragraph>'            => 'docs/index',
                
'docs/<paragraph>/<section>'  => 'docs/section',
    ];


а путь к нему указать в качестве аргумента этой настройки
1
2
3
4


            'route_rules' => __DIR__ .'/routes.php',




Это удобно, когда правил маршрутизации много.

Правила маршрутизации. #
К оглавлению

Правилом является элемент массива в секции 'route_rules', где параметром должна быть маска URI, а значением - маршрут (controller/action). Согласно маске и маршруту фреймворк генерирует GET-параметры, которые будут доступны из сервиса Params

В маске могут быть различные комбинации, вот несколько примеров:

URI Правило GET
http://abc-framework '/' => 'main/index' GET['controller'] = 'main'
GET['action']     = 'index'
http://abc-framework/docs 'docs' => 'docs/index' GET['controller'] = 'docs'
GET['action']     = 'index'
http://abc-framework/docs/5 'docs/<id:\d+>' => 'docs/edit' GET['controller'] = 'docs'
GET['action']     = 'edit'
GET['id']         = 5
http://abc-framework/docs/rules 'docs/<section>' => 'docs/index' GET['controller'] = 'docs'
GET['action']     = 'index'
GET['section']    = 'rules'


Правила построения маски. #
К оглавлению

1. Простой текст воспринимается жестко, по полному совпадению.

2. Текстом в бричках (<имя>) является имя параметра, в которое будет подставлено значение из URL.

3. Если указан именованный параметр, и, через двоеточие, регулярное выражение (<имя:RegExp>), будет осуществляться поиск по этому выражению.

4. Поиск прекращается при первом совпадении.


Примеры построения #.
К оглавлению

Допустим, есть такой набор правил:
1
2
3
4
5
6
7
8


    
'guest'             => 'guest/index',
    
'<section>'         => 'guest/read',
    
'guest/<section>'   => 'guest/posts',
    
'guest/<id:\d+>'    => 'guest/add',
]




Согласно этому набору будут произведены следующие разборы:

URI Описание GET
http://abc-framework/guest Сработает первое правило,
так как есть жесткое совпадение.
GET['controller'] = 'guest'
GET['action']     = 'index'
http://abc-framework/users Сработает второе правило,
так как нет ограничений
для входящего параметра
GET['controller'] = 'guest'
GET['action']     = 'read'
GET['section']    = 'users'
http://abc-framework/guest/users Сработает третье правило,
так как есть два параметра:
по первому жесткое совпадение,
второй произвольный
GET['controller'] = 'guest'
GET['action']     = 'posts'
GET['section']    = 'users'
http://abc-framework/guest/5 Сработает третье правило,
(не четвертое), так как оно
удовлетворяет условию.
GET['controller'] = 'guest'
GET['action']     = 'posts'
GET['section']    = 5
http://abc-framework/guest/5 Для фильтрации по числовым
значениям нужно поменять
местами третье и четвертое правила.
GET['controller'] = 'guest'
GET['action']     = 'add'
GET['id']         = 5