我正在尝试从随机URL(我的应用程序的一部分)获取路由信息。
我尝试使用URL实例化Zend_Controller_Request_Http,但它没有自动填写控制器,模块,操作字段。
我认为它应该以某种方式链接到路线信息,但无法确定如何连接它。
任何线索?
答案 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。希望有所帮助。