Это не связано напрямую. Происходит то, что маршрутизатор вызывает свой метод route
, передавая запрос в качестве аргумента. Затем он перебирает все зарегистрированные маршруты в обратном порядке, вызывая метод маршрута match
с запросом в качестве аргумента - если он совпадает, он устанавливает параметры запроса до его возврата.
Проблема в том, что вы не можете напрямую вызвать Zend_Controller_Router_Rewrite :: route без изменения текущего цикла запроса, поэтому вы должны полагаться на некоторую «ложь» или воспроизводить логику в этом методе в своем собственном рутерном sbuclass или другом месте.
Пример обмана:
// assume $router is your router instance, $request is the REAL request.
$testRequest = new Zend_Controller_Request_Http($url);
// need to use a try because if the route doesnt match youve got an exception coming
try {
$router->route($testRequest);
} catch(Zend_Controller_Router_Exception $e) {
$testRequest = false;
}
// revert back to the real current route which was modified during the previous call
$router->route($request);
if(false !== $testRequest) {
// consume what you need form testRequest as you normally would
print_r($testRequest->getParams());
}
Я столкнулся с проблемами в дальнейшем после того, как начал изучать более сложные жизненные циклы запросов. Я не помню, почему, но я помню, что мое решение заключалось в подклассе маршрутизатора и объявлении метода, который route
выглядел примерно так:
public function parseRoute(Zend_Controller_Request_Abstract $request)
{
$preservedRoute = $this->_currentRoute;
try {
$router->route($request);
$this->_currentRoute = $preservedRoute;
} catch(Zend_Controller_Router_Exception $e) {
$this->_currentRoute = $preservedRoute;
return false;
}
return $request;
}
Также имейте в виду, что это все из памяти, и это было с 1.6 или 1.7, а не с текущей версией, так что YMMV. Надеюсь, это поможет.