Получить информацию о маршруте из Zend_Controller_Request - PullRequest
3 голосов
/ 11 августа 2010

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

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

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

Есть ли отведения?

1 Ответ

1 голос
/ 11 августа 2010

Это не связано напрямую. Происходит то, что маршрутизатор вызывает свой метод 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. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...