从Zend_Controller_Request获取路由信息

时间:2010-08-11 01:48:14

标签: php zend-framework request routes

我正在尝试从随机URL(我的应用程序的一部分)获取路由信息。

我尝试使用URL实例化Zend_Controller_Request_Http,但它没有自动填写控制器,模块,操作字段。

我认为它应该以某种方式链接到路线信息,但无法确定如何连接它。

任何线索?

1 个答案:

答案 0 :(得分:1)

它没有直接联系。发生的事情是路由器调用其route方法传递请求作为其参数。然后以相反的顺序循环遍历所有已注册的路由,并以请求作为参数调用路由的match方法 - 如果匹配则在请求返回之前设置请求的参数。

问题是你不能直接调用Zend_Controller_Router_Rewrite :: route而不修改当前的请求周期,所以你必须依赖一些“fudgery”或者在你自己的rb slass中重现这个方法中的逻辑。

捏造的例子:

// 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。希望有所帮助。