在Zend Framework 2中路由,跳过url中的'index'动作但获取id

Mat*_*ann 2 php zend-route zend-framework2

我有一个可以援引作为一个控制器modulename/xmlcoverageindex行动以及其他一些动作,让说testAction().这个控制器的网址是xml/coverage.

然后,默认方式xml/coverage映射到我的索引操作.并xml/coverage/test映射到testAction.如果我需要testAction的id,那么url就像xml/coverage/test/33是.

但是,对于索引操作,它需要是xml/coverage/index/33 我希望的位置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',
                ),
        ),
),
Run Code Online (Sandbox Code Playgroud)

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

相反,我得到一个错误,说该网址无法匹配.所以对我来说,它的行为好像是'/xml/coverage[/:action[/:id]]'因为我出于某种原因必须指定行动来识别id.

我做错了什么,我怎样才能让网址按照我的意愿行事?谢谢.

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

$this->url('xmlcoverage', array('action' => 'index', 'id' => $someid))
Run Code Online (Sandbox Code Playgroud)

实际上在表单上提供了一个xml/coverage/1会崩溃的URL !改变路线/xml/coverage[/:action[/:id]]至少会使网址助手产生工作网址..

Mat*_*ann 5

在与IRC上的优秀ZF2人员交谈和调试之后,我们追踪了路由中的一个错误.

在讨论中,我为我的问题做了一个小例子,就在这里.正如您在此处的var转储中所看到的,在第二种情况下,操作会丢失,它应该默认为"index".

但是,如果有人现在需要此功能,可以采取以下方法解决问题:

  1. 而不是让路由/test[/:action][/:id]有它/test[/:action[/:id]],那么url帮助器将添加/ index /并且至少它可以工作.
  2. 制作一条新路线,您只能听到/test[/:id]另一条路线.
  3. 在你的控制器中,做public function notFoundAction() { $view = new ViewModel($this->indexAction()); //etc}Kinda hacky,但有了这个bug,它会发送一个未找到的动作,你可以背负.