【问题标题】:My Zend Framework Routes are not stacking properly我的 Zend 框架路由没有正确堆叠
【发布时间】:2012-02-22 13:34:58
【问题描述】:

我的 zend 框架应用程序中有一个模块(站点)。我要做的是首先检查控制器/动作是否存在,如果不存在,则尝试将 URL 与一些自定义路由匹配。

我在_bootstrap.php中的代码如下:

$router = $this->frontController->getRouter();
$router->removeDefaultRoutes();

// catalog category product route
$route = new Zend_Controller_Router_Route(
        ':categoryIdent/:productIdent',
        array(
            'action'        => 'view',
            'controller'    => 'product',
            'module'        => 'site',
            'categoryIdent' => '',
            'productIdent' => ''
        ),
        array(
            'categoryIdent' => '[a-zA-Z-_0-9]+',
            'productIdent'  => '[a-zA-Z-_0-9]+'
        )
);

$router->addRoute('catalog_category_product', $route);


$router->addDefaultRoutes();

我知道 Zend Framework 中的路由是反向匹配的。所以我尝试了以下网址。

  1. example.com/site/index/index -> OK(执行动作/控制器 => 索引/索引)
  2. example.com/bags/bag-7 -> OK(执行动作/控制器 => 产品/视图)
  3. example.com/index/index -> 错误(执行操作/控制器 => 产品/视图,但这应该是默认路由的一部分,在末尾定义)

这是问题所在,我不明白为什么不应用默认控制器/动作路由。

【问题讨论】:

    标签: zend-framework


    【解决方案1】:

    您的第三个示例与您的 catalog_category_product-route 的模式相匹配。这就是它被发送到产品/视图的原因。

    您可以尝试向 :productIdent 和/或 :categoryIdent 添加要求,以便索引/索引与这些要求不匹配。

    The reference manual explains how to set variable requirements.

    编辑:我错过了,您已经提出了要求。但是索引/索引仍然匹配 :categoryIndent/:productIndent。您可以对 :productIndent 使用以下正则表达式,假设它始终是单词 - 破折号 - 数字:

    '/^([a-z]+-[0-9]+)$/'
    

    【讨论】:

    • 感谢马霍克的回复。我知道第三个示例匹配“catalog_category_product”路线。但不应该使用它,因为有默认路由也是匹配的。在第三种情况下 index/index 是一个有效的控制器/动作对。这是我正在寻找答案的问题。
    • 在这种情况下,您应该记住,路由匹配的顺序。您的路线添加在默认路线之后,因此它将在其之前匹配(LIFO - 后进先出)。无论如何,更改路线的顺序对您没有帮助,因为这会破坏 2.,因为它将匹配默认路线。解决您的问题的最佳方法(在我看来)是,在您的路线前加上 catalog/:categoryIdent/:productIdent 之类的静态文本 [编辑:或在您的路线中有更严格的要求,如我的回答所示]
    • 你说我的自定义路由是在默认路由后面加的,其实不是。正如您在示例代码中看到的,我首先删除了默认路由,添加了我的自定义路由,然后我再次添加了我的默认路由。更改路由不是一个选项,因为那样我将无法使用默认路由匹配控制器/操作。我知道我可以使用前缀,但我很好奇为什么路由号 3 在示例中不匹配。这是我的问题。不管怎样,谢谢你的努力。我很感激!
    • 您的默认路由匹配:module/:controller/:action,而您的路由匹配:categoryIdent/:productIdent。 url index/index 确实与默认路由不匹配,但与您的路由匹配。这就是它使用ProductController::viewAction() 的原因。但是,即使您在默认路由和没有:module 的路由之间指定了一条路由,您也会遇到bags/bag-7index/index 会匹配不需要的路由的问题。这就是为什么您要么必须细化路线要求,要么在之后添加更具体的路线,仅匹配索引/索引。
    • 我刚刚看到我的错误。 ZF 手册说,“无效的模块映射到控制器名称”。但它并没有说无效的模块/控制器像我假设的那样映射到控制器/动作。感谢您的帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多