A free and open-source book on ZF3 for beginners


5.9. Извлечение параметров из маршрута

При удачном сопоставлении, маршрутизатор (класс маршрута верхнего уровня) возвращает некоторые параметры: "умолчания" (параметры, перечисленные в разделе defaults конфигурации маршрутизации) и все шаблонные параметры, извлеченные из строки URL.

В контроллере вам часто придется извлекать эти параметры. Мы уже делали это в примерах выше. В этом разделе мы подведем некоторые итоги.

Так, чтобы извлечь параметр из маршрута в методе действия контроллера, как правило, используется плагин контроллера Params и его метод fromRoute(), который принимает два аргумента: имя нужного параметра и значение, которое нужно будет вернуть, если этого параметра нет.

Метод fromRoute() может также использоваться для извлечения всех параметров сразу в виде массива. Это делается вызовом fromRoute() без передачи ему аргументов, как показано в примере ниже:

// Пример действия.
public function someAction() 
{
    // Получаем один параметр 'id' от маршрута.
    $id = $this->params()->fromRoute('id', -1);
  
    // Получаем все параметры маршрута сразу в виде массива.
    $params = $this->params()->fromRoute();
  
    //...				
}

5.9.1. Извлечение объектов RouteMatch и Router

При удачном сопоставлении класс маршрутизатора внутренне создает экземпляр класса Zend\Router\RouteMatch, предоставляя методы для извлечения имени соответствующего маршрута и полученных из него параметров. Полезные методы класса RouteMatch перечислены в таблице 5.3:

Table 5.3. Zend\Router\RouteMatch class methods
Имя метода Описание
getMatchedRouteName() Получает имя соответствующего маршрута.
getParams() Получает все параметры.
getParam($name, $default) Получает определенный параметр.

В большинстве случаев будет достаточно использования плагина контроллера Params, но вы также можете использовать для этой цели объект RouteMatch.

Для получения объекта RouteMatch из метода действия контроллера, используйте следующий код:

// An example action.
public function someAction() 
{
    // Получает объект RouteMatch.
    $routeMatch = $this->getEvent()->getRouteMatch();
  
    // Получает имя соответствующего маршрута.
    $routeName = $routeMatch->getMatchedRouteName();
  
    // Получает все параметры маршрута в виде массива.
    $params = $routeMatch->getParams();
  
    //...				
}

В строке 5 этого фрагмента кода мы используем метод getEvent()базового класса AbstractActionController для извлечения объекта MvcEvent, который представляет собой событие (В ZF3 жизненный цикл приложения состоит из событий). Затем мы используем метод getRouteMatch() класса MvcEvent для извлечения объекта RouteMatch.

В строке 8 мы используем метод getMatchedRouteName() для извлечения имени маршрута, который соответствует HTTP-запросу, а в строке 11 мы извлекаем все его параметры.

Класс MvcEvent также может использоваться для извлечения маршрутизатора (класса маршрута верхнего уровня). Это можно сделать с помощью метода getRouter() класса MvcEvent, как показано ниже:

// Вызовите внутри метода действия
// для извлечения RouteStackInterface для класса маршрутизатора.
$router = $this->getEvent()->getRouter();

Здесь мы используем метод getRouter(), который возвращает интерфейс RouteStackInterface. Этот интерфейс является базовым для SimpleRouteStack и TreeRouteStack и предоставляет методы для работы с маршрутами, содержащимися внутри стека маршрутов.


Top