2010-08-11 3 views
3

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

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

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

Любые провода?

ответ

1

Не имеет прямой связи. Что происходит, маршрутизатор вызывает свой метод route, передающий запрос в качестве аргумента. Затем он перемещается по всем зарегистрированным маршрутам в обратном порядке, вызывая метод match маршрута с запросом в качестве аргумента - если он соответствует ему, он устанавливает параметры запроса перед его возвратом.

Проблема заключается в том, что вы не можете напрямую вызвать Zend_Controller_Router_Rewrite :: route без изменения текущего цикла запросов, поэтому вам нужно полагаться на некоторую «fudgery» или воспроизвести логику этого метода в вашем собственном ruter sbuclass или elsehwere.

Пример жульничество:

// 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()); 
} 

я столкнулся с проблемами с этим вниз линию после того, как я начал получать в более сложных запросов lifecyles. Я не помню, почему, но я помню, что мое решение было подклассов маршрутизатора и объявления метод, 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. Надеюсь, это поможет.

+0

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

Смежные вопросы