138  /  382
Справочник

Маршруты

Просмотров: 38872
Дата последнего изменения: 07.11.2023
Роберт Басыров
Сложность урока:
4 уровень - сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

  Запросы

Описание маршрутов начинается с определения метода запроса. Поддерживаются 3 комбинации методов:

$routes->get('/countries', function () {
    // сработает только на GET запрос
});

$routes->post('/countries', function () {
    // сработает только на POST запрос
});

$routes->any('/countries', function () {
    // сработает на любой тип запроса
});

Для указания произвольного набора методов следует использовать метод methods:

$routes->any('/countries', function () {
    // сработает на любой тип запроса
})->methods(['GET', 'POST', 'OPTIONS']);

  Параметры

Для определения параметра в адресе используются фигурные скобки:

$routes->get('/countries/{country}', function ($country) {
        return "country {$country} response";
});

По умолчанию для параметров используется паттерн [^/]+. Для указания своего критерия используется метод маршрута where:

$routes->get('/countries/{country}', function ($country) {
        return "country {$country} response";
})->where('country', '[a-zA-Z]+');

Если значение параметра может содержать /, то следует использовать паттерн .*:

$routes->get('/search/{search}', function ($search) {
        return "search {$search} response";
})->where('search', '.*'); 

У параметров могут быть значения по умолчанию, в таком случае им необязательно присутствовать в адресе:

$routes->get('/countries/{country}', function ($country) {
        return "country {$country} response";
})->default('country', 'Australia');

// маршрут будет выбран при запросе /countries/
// при этом параметр country будет иметь указанное значение

Для удобства можно задать и вовсе не участвующие в формировании адреса параметры:

$this->routes->get('/countries/hidden', function ($viewMode) {
        return 'countries response {$viewMode}';
})->default('viewMode', 'custom');

Доступ к значениям параметров маршрута получается через параметры контроллера или объект текущего маршрута:

$routes->get('/countries/{country}', function ($country) {
        return "country {$country} response";
});

...

$app = \Bitrix\Main\Application::getInstance(); 
$country = $app->getCurrentRoute()->getParameterValue('country');    

  Имена

Для удобства и систематизации списка маршрутов присвойте маршруту уникальный идентификатор - имя:

$routes->get('/path/with/name', function () {
        return 'path with name';
})->name('some_name');

В дальнейшем это позволит обращаться к маршруту при генерации ссылок.

  Контроллеры

В роутинге поддерживается несколько видов контроллеров:

  1. Контроллеры Bitrix\Main\Engine\Controller:
    $routes->get('/countries', [SomeController::class, 'view']);
    
         // будет запущено действие SomeController::viewAction()
  2. Отдельные действия контроллеров Bitrix\Main\Engine\Contract\RoutableAction:
    $routes->get('/countries', SomeAction::class);
  3. Замыкания:
    $routes->get('/countries/', function () {
             return "countries response";
         });

    В качестве аргументов возможно указать объект запроса Bitrix\Main\HttpRequest, объект текущего маршрута Bitrix\Main\Routing\Route, а также именованные параметры маршрута в любой комбинации:

    use Bitrix\Main\HttpRequest;
    use Bitrix\Main\Routing\Route;
    
    $routes->get('/countries/{country}', function ($country, HttpRequest $request) {
            return "country {$country} response";
    });
    
    $routes->get('/countries/{country}', function (Route $route) {
            return "country {$route->getParameterValue('country')} response";
    });
  4. Для обратной совместимости с публичными страницами предусмотрен класс Bitrix\Main\Routing\Controllers\PublicPageController:
     $routes->get('/countries/', new PublicPageController('/countries.php'));

10
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии
Сергей Куклин
Для опциональных, достаточно поставить вопрос после параметра:
Код
/test/{param1}/{param2}? // без слеша на конце
/test/{param1}/({param2}/)? // если нужен слеш

Это сгенерирует regexp вида:
Код
#^/test/(?<param1>[^/]+)/(?<param2>[^/]+)?/?$#

см. \Bitrix\Main\Routing\Route::match()