2

我有一个控制器,可以像操作和其他一些操作一样调用modulename/xmlcoverageindex比如说testAction()。这个控制器的 url 是xml/coverage.

然后,默认方式是xml/coverage映射到我的索引操作。这xml/coverage/test映射到 testAction。如果我需要 testAction 的 id,则 url 就像这样xml/coverage/test/33

但是,对于索引操作,它需要是xml/coverage/index/33 Where I would like it be xml/coverage/33

这是我的路线

'xmlcoverage' => array(
        'type'    => 'segment',
        'options' => array(
                'route' => '/xml/coverage[/:action][/:id]',
                'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                ),
                'defaults' => array(
                        'controller' => 'modulename/xmlcoverage',
                        'action'     => 'index',
                ),
        ),
),

在尝试 url xml/coverage/33 时,我认为 33 应该映射到 id,因为它与操作的正则表达式不匹配,并且两者都是可选的。而且由于它不匹配一个动作,所以应该使用默认值(索引)。

相反,我收到一条错误消息,指出路由无法匹配 url。所以对我来说,它的作用就好像路由是'/xml/coverage[/:action[/:id]]'因为我出于某种原因必须为其指定操作以识别 id。

我做错了什么,我怎样才能让网址按我的意愿工作?谢谢。

编辑:这是一个问题。 在我看来这样做:

$this->url('xmlcoverage', array('action' => 'index', 'id' => $someid))

xml/coverage/1实际上在表单上给出了一个会崩溃的 URL !将路由更改/xml/coverage[/:action[/:id]]为至少会使 url 助手生成工作 url。

4

1 回答 1

5

在与 IRC 上优秀的 ZF2 人员交谈和调试后,我们发现了路由中的一个错误。

在讨论过程中,我为我的问题做了一个小例子,这里是。正如您从 var dump here中看到的那样,该操作在第二种情况下会丢失,它应该默认为“index”。

但是,如果有人现在需要此功能才能正常工作,可以使用以下方法来解决它:

  1. url 助手将添加 /index/ 并且至少它可以工作,而不是/test[/:action][/:id]让它成为它的路由。/test[/:action[/:id]]
  2. /test[/:id]制作一条新路线,除了另一条路线外,您只听。
  3. 在你的控制器中,做public function notFoundAction() { $view = new ViewModel($this->indexAction()); //etc}Kinda hacky,但是有了这个错误,它会发送一个未找到的动作,你可以捎带它。
于 2012-07-19T06:44:11.657 回答