Получите информацию о маршруте из запроса контроллера Zend
Я пытаюсь получить информацию о маршруте из случайного URL-адреса (часть моего приложения).
Я попытался создать экземпляр Zend_Controller_Request_Http с URL-адресом, но он автоматически не заполнял поля контроллера, модуля, действия.
Я полагаю, что это должно быть как-то связано с информацией о маршруте, но не могу понять, как это подключить.
Есть какие-нибудь зацепки?
1 answers
Это не связано напрямую. Что происходит, так это то, что маршрутизатор вызывает свой метод route
, передавая запрос в качестве аргумента. Затем он проходит по всем зарегистрированным маршрутам в обратном порядке, вызывая метод match
маршрута с запросом в качестве аргумента - если он совпадает, он устанавливает параметры запроса до его возврата.
Проблема в том, что вы не можете напрямую вызвать Zend_Controller_Router_Rewrite::маршрут без изменения текущего цикла запроса, поэтому вам приходится полагаться на некоторые "выдумки" или воспроизведите логику этого метода в своем собственном компьютерном классе 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, а не с текущей версией, так что МММВ. Надеюсь, это поможет.