【问题标题】:Zend Framework - How to loop through routes in a controllerZend Framework - 如何在控制器中循环路由
【发布时间】:2014-01-10 06:40:46
【问题描述】:

我在 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"
                  }
                  ...
                }
              }

【问题讨论】:

    标签: php zend-framework routes


    【解决方案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));
    

    【讨论】:

    • 感谢您的评论。那部分不是问题,我已经用更多细节更新了我的问题,这样您就可以看到我在哪里以及我正在尝试访问什么。非常感谢!
    • 谢谢 我从来没有见过 ReflectionProperty 的使用,这是我学习的一个很好的例子。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多