Получите информацию о маршруте из запроса контроллера Zend


Я пытаюсь получить информацию о маршруте из случайного URL-адреса (часть моего приложения).

Я попытался создать экземпляр Zend_Controller_Request_Http с URL-адресом, но он автоматически не заполнял поля контроллера, модуля, действия.

Я полагаю, что это должно быть как-то связано с информацией о маршруте, но не могу понять, как это подключить.

Есть какие-нибудь зацепки?

Author: The Mighty Rubber Duck, 2010-08-11

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, а не с текущей версией, так что МММВ. Надеюсь, это поможет.

 1
Author: prodigitalson, 2010-08-11 02:42:20