Zend_Controller_Router_Exception:未指定“xyz”

时间:2009-08-12 07:58:00

标签: php exception zend-framework

我在当前的Zend Framework应用程序中遇到了问题。

在我的Bootstrap中,我注册了这些路线:

protected function _initRouter()
{
    $this->bootstrap("FrontController");
    $frontController = $this->getResource("FrontController");

    $route = new Zend_Controller_Router_Route(
        ":module/:id",
        array(
            "controller" => "index",
            "action" => "index"
            ),
        array("id" => "\d+")
        );
    $frontController->getRouter()->addRoute('shortcutOne', $route);

    $route = new Zend_Controller_Router_Route(
        ":module/:controller/:id",
        array("action" => "index"),
        array("id" => "\d+")
        );
    $frontController->getRouter()->addRoute('shortcutTwo', $route);

    $route = new Zend_Controller_Router_Route(
        ":module/:controller/:action/:id",
        null,
        array("id" => "\d+", "action" => "\w+")
        );
    $frontController->getRouter()->addRoute('shortcutThree', $route);
}

现在稍后我将Zend_Navigation添加到我的项目中。我有几个模块,它们在模块引导程序中注册导航元素:

<?php

class Contact_Bootstrap extends Zend_Application_Module_Bootstrap
{
    protected function _initNavigation()
    {
        $layout = $this->getApplication()->getResource("layout");
        $view = $layout->getView();

        $config = new Zend_Config_Xml(dirname(__FILE__)."/config/navigation.xml", "nav");

        $view->navigation()->addPage($config);
    }
}

当我在浏览器中打开应用程序时,一切正常。这意味着我可以看到导航并单击其链接以查看指定的页面。但当我点击使用:module /:action /:id路由的页面时,Navigation Helper会抛出Zend_Controller_Router_Route异常:

  

致命错误:Zend_Controller_Router_Exception:在第519行的C:\ Entwicklung \ kt \ trunk \ src \ library \ Zend \ View \ Helper \ Navigation \ HelperAbstract.php中未指定id

您是否有人遇到此错误?如果你可以帮助我或给我建议,那将是很棒的。如果您需要有关我的设置等的更多信息,请告诉我。

谢谢!

6 个答案:

答案 0 :(得分:6)

我自己找到了解决方案。

此问题是由于Zend_Navigation元素的不太有益的行为引起的。在他们的getHref()方法中,他们使用URL帮助器。此助手创建导航条目必须链接到的URL,接受为导航元素指定的参数(模块,控制器,操作等)

现在,问题在于,如果您像我一样在引导程序中创建了自定义路由,例如

":module/:controller/:id"

您遇到的问题是,当使用此路由时,URL帮助程序使用该路由生成导航条目的链接。但是,我没有传递额外的“id”参数,所以我得到了例外。

因此,一种解决方案是为每个Zend_Navigation_Page_Mvc实例“route”传递一个附加参数,该实例设置为“default”。

我还没有尝试的另一个解决方案是让新的自定义路由重新映射到默认路由,例如:

":module/:controller/:action/id/$id"

但我不知道你是否有能力与Zend Framework合作。

答案 1 :(得分:4)

$route = new Zend_Controller_Router_Route( 
    "info/:id", 
    array( 
        "controller" => "index", 
        "action" => "index" 
    ), 
    array("id" => "\d+") 
); 

更改为

$route = new Zend_Controller_Router_Route( 
    "info/:id", 
    array( 
        "controller" => "index", 
        "action" => "index",
        "id" => "default"
    )
); 

为我工作,但可能不是最好的方式

答案 2 :(得分:3)

我遇到了同样的问题,这里的解决方案对我有用: 我将route参数添加到我的navigation.xml文件中的所有链接,如下所示

    <?xml version="1.0" encoding="UTF-8"?>
    <navigation>
        <mainmenu>
        <home>
                <label>topmenu:homepage</label>
                ===> <route>default</route> <===
                <module>default</module>
                <controller>index</controller>
                <action>index</action>
        </home>
    </mainmenu>
</navigation>

答案 3 :(得分:2)

在此路由“:module /:controller /:id”中,您只需为:id

定义默认值

示例:

<content type="Zend_Controller_Router_Route">
    <route>content/:engine</route>
    <defaults module="content" controller="engine" action="index" engine="" />
</content>

对不起我的英文:)

问候。

答案 4 :(得分:2)

我刚刚遇到了类似于你的问题但是找到了一个不同的解决方法。我只是为了提供信息而在这里分享。

就像你一样,我的问题似乎是我的导航是使用上次使用的路线构建的。这意味着如果我的一个自定义路由已被使用,我会得到一堆异常,抱怨某个自定义参数没有被定义。

我的路线定义中的大部分路线“自定义参数”值默认为null。我发现如果我将默认值更改为'',则异常实际上会消失。我真的不明白这一点,所以我开始谷歌搜索,偶然发现了你的帖子,这让我走上正确的道路 - 我想。

我的导航元素存储在数据库中,因此我根据请求生成所有Zend_Navigation_Page元素,并将容器传递给我的视图助手(我将容器对象序列化以使其可缓存,但现在不相关)。我并没有真正发现将params的默认值更改为''看起来像一个“好”的方式,所以我的帖子暗示我试图更改存储在我的数据库中的所有页面元素,以使用路由命名为'default',除非它们明确意味着使用自定义路由并为其定义了params。明确地定义我的导航点以使用默认路线似乎也可以做到这一点,对我来说它似乎是一个更干净的解决方法。

感谢提示导致此错误的原因 - 除了例外,我真的不知道从哪里开始:)

答案 5 :(得分:0)

我在这里看到两个解决方案:

  1. 您可以在_initRouter()中为路由参数设置默认值,但它可能不是您想要的(例如,在这种情况下,您可能会在不需要时使用此路由)

  2. 您可以在navigation.xml中指定路径参数(params属性)。如果你不想修复它们,你需要编写PHP代码来生成导航xml。