Я пишу свой собственный маршрутизатор для расширения Zend Framework 2 проекта Zend \ Mvc \ маршрутизатор \ RouteInterface. Маршруты должны исходить из базы данных (большой проект с сотнями страниц). Работающему маршрутизатору, очевидно, нужны только два метода: match()
а также assemble()
, Матч один у меня сработал хорошо.
Но что насчет assemble()
? Что должен вернуть этот метод? Может быть, он возвращает только базовый путь к приложению?
Вот какой у одного из внутренних роутеров (Zend \ Mvc \ маршрутизатор \ 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);
}
В основном, сборка — это то, что называется, когда вы делаете такие вещи, как $this->redirect-toRoute($name, $params);
поэтому он должен возвращать строку URL на основе конфигурации маршрута. что маршрут может совпадать с использованием той же конфигурации маршрута.
Когда вы звоните toRoute, опубликованный вами маршрут маршрута находит маршрут с именем, указанным вами в вызове, а затем просит его собрать 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));
стек маршрутов найдет конкретизированный маршрут для ‘test’, это \ Zend \ Mvc \ Router \ Http \ Segment, а затем вызовет функцию сборки, которая примет параметры, отправленные с помощью вызова toRoute, и выдаст URL такая строка
/ Тест / 1
и это в основном то, что делает функция сборки.
Других решений пока нет …