2015-02-08 8 views
0

Я пишу свой собственный маршрутизатор для проекта Zend Framework 2, расширяя Zend\Mvc\Router\RouteInterface. Маршруты должны поступать из базы данных (большой проект с сотнями страниц). Рабочий маршрутизатор, очевидно, нуждается только в двух методах: match() и assemble(). В матче я работал нормально.Что может быть результатом Zend Mvc Router RouteInterface :: assembly() в ZF2

Но как насчет assemble()? Что должен вернуть этот метод? Может ли это только вернуть базовый путь приложения?

Вот что одна из внутренних маршрутизаторов (Zend\Mvc\Router\SimpleRouteStack) из ZF2 делает:

/** 
* assemble(): defined by RouteInterface interface. 
* 
* @see \Zend\Mvc\Router\RouteInterface::assemble() 
* @param array $params 
* @param array $options 
* @return mixed 
* @throws Exception\InvalidArgumentException 
* @throws Exception\RuntimeException 
*/ 
public function assemble(array $params = array(), array $options = array()) 
{ 
    if (!isset($options['name'])) { 
     throw new Exception\InvalidArgumentException('Missing "name" option'); 
    } 

    $route = $this->routes->get($options['name']); 

    if (!$route) { 
     throw new Exception\RuntimeException(sprintf('Route with name "%s" not found', $options['name'])); 
    } 

    unset($options['name']); 

    return $route->assemble(array_merge($this->defaultParams, $params), $options); 
} 

Ссылка: Custom Routing in Zend Framework 2

ответ

1

В основном собрать то, что будет звонить, когда вы делаете такие вещи, как $this->redirect-toRoute($name, $params);

поэтому он должен вернуть строку URL на основе конфигурации маршрута. что маршрут может совпадать с использованием той же конфигурации маршрута.

При вызове toRoute routestack, что вы вывесили находит маршрут с именем, указанным в запросе, а затем просит его собрать URL для этого маршрута

'test' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/test[/:id]', 
     'constraints' => array(
      'id'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
     ), 
     'defaults' => array(
      '__NAMESPACE__' => 'Application\Controller', 
     ), 
    ), 
), 

этот маршрут под названием «тест», когда мы вызовите $this->redirect-toRoute('test', array('id' => 1));, в стеке маршрутов найдется инстанцированный маршрут для «теста», это \ Zend \ Mvc \ Router \ Http \ Segment, а затем вызывает его сборку, которая будет принимать параметры в вызове toRoute, и это даст строка URL, подобная этому

/тест/1

И это в основном то, что делает сборка.