Zend Framework - 如何循环控制器中的路由

时间:2014-01-08 23:44:16

标签: php zend-framework routes

我在Zend的控制器中,我想循环遍历当前路线。我能够获得路线,但它们受到保护,所以我无法循环它们。以下是我用来获取路线的信息:

    $routes = Zend_Controller_Front::getInstance()->getRouter();

    foreach ($routes as $key => $route) {
         // I need to get controller and action for each $route but it is protected, see debug output of $route below to see what I am trying to access.
    }

我看到了_routes并获得了它的名称,但我需要每条路线的控制器和动作,这些都受到保护。有没有办法实现这个目标?我已经搜索过Google和Stack,但似乎找不到任何东西。

编辑:只是在给出第一个答案的情况下再详细说明。我没有问题获取路由,它返回一个Zend_Controller_Router_Route_Chain对象的数组,我可以循环,看起来像这样:

    object(Zend_Controller_Router_Route_Chain)#83 (5) {
              ["_routes":protected]=>
           array(2) {
                [0]=>
                object(Zend_Controller_Router_Route_Hostname)#34 (13) {
                  ["_hostVariable":protected]=>
                  string(1) ":"
                  ...
                }
                [1]=>
                object(Zend_Controller_Router_Route_Static)#78 (4) {
                  ["_route":protected]=>
                  string(0) ""
                  ["_defaults":protected]=>
                  array(3) {
                    ["module"]=>
                    string(7) "default"
                    ["controller"]=>
                    string(5) "index"
                    ["action"]=>
                    string(14) "hubverify-home"
                  }
                  ...
                }
              }

1 个答案:

答案 0 :(得分:1)

默认路由器为Zend_Controller_Router_Rewrite,其方法为getRoutes,因此尝试获取所有路由: Zend_Controller_Front::getInstance()->getRouter()->getRoutes()

编辑:由于Zend_Controller_Router_Route_Chain没有$_routes属性的getter,你有两个选择:

A)延长Zend_Controller_Router_Route_Chain

class My_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Chain
{
    public function getRoutes()
    {
        return $this->_routes;
    }    
}

B)使用ReflectionProperty将$ _routes设置为可访问:

$prop = new ReflectionProperty(get_class($chainedRoute), '_routes');
$prop->setAccessible(true);
var_dump($prop->getValue($chainedRoute));