【问题标题】:Zend Framework: Checking if route exists from codeZend Framework:从代码中检查路由是否存在
【发布时间】:2021-03-08 18:44:28
【问题描述】:

在 zend 框架中,我是否可以从代码中检查路由是否存在?

示例

说以下路由/url 是有效的(指向控制器/动作)

/users
/users/1 // /users?id=1
/users/page/1  /users?page=1
/users/tagged/tagname/page/1 /users?tagged=1&page=1

如果用户尝试转到/users/nonexistantpage,它应该会失败。检查用户是否请求 url,它会失败,但在代码级别。

【问题讨论】:

    标签: zend-framework routing


    【解决方案1】:

    我相信您正在寻找 Zend 路由器的 match() 方法。看看有没有帮助。

    【讨论】:

    • 那个方法来自Zend_Controller_Router_Route 当我做Zend_Controller_Front::getInstance()->getRouter() 我得到Zend_Controller_Router_Rewrite 我怎样才能得到一条路线,我需要循环所有路线吗?
    • 无论如何我都尝试过pastie.org/1422932,但我发现像/projects/adashds 这样的URI 与路由pastie.org/1422935 匹配是有效的。显然adashdsAction 不存在
    【解决方案2】:

    这是一个老问题,但我想这就是你要找的:

    foreach(Zend_Controller_Front::getInstance()->getRouter()->getRoutes() as $route)
    {
        $route->match($uri);
    }
    

    【讨论】:

      【解决方案3】:

      对于那些使用 Zend Framework 2 的人来说,这非常简单。

      假设我们要检查一个 URI 是否与注册的路由器匹配,如果这与当前 url 不同,则重定向用户。

      $goto = 'http://www.mysite.tld/admin';
      
      $request  = $this->getRequest();
      $request->setUri($goto);
      
      if ($routeToBeMatched = $this->getServiceLocator()->get('Router')->match($request)) {
          $currentRouteMatchName = $this->getEvent()->getRouteMatch()->getMatchedRouteName();
          if ($routeToBeMatched->getMatchedRouteName() != $currentRouteMatchName) {
              return $this->redirect()->toRoute($goto);
          }
      }
      

      【讨论】:

        【解决方案4】:

        如果你使用重写路由器(Zend_Controller_Router_Rewrite),它有一个方法hasRoute($route_name)

        然后,如果您想检查应用程序中是否存在路由,您可以这样检查:

        Zend_Controller_Front::getInstance()->getRouter()->hasRoute("my_route");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-14
          • 2019-12-09
          • 2016-07-08
          • 1970-01-01
          • 2017-10-02
          • 2012-08-13
          相关资源
          最近更新 更多