Zend Framework 2中的路由,跳过';索引';url中的操作,但获取id


Routing in Zend Framework 2, skip 'index' action in url but get id

我有一个控制器,可以通过index操作和其他一些操作(比如testAction())调用为modulename/xmlcoverage。此控制器的url为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',
                ),
        ),
),

当尝试url xml/coverage/33时,我认为33应该映射到id,因为它与action的regex不匹配,而且两者都是可选的。由于它与操作不匹配,因此应该使用默认值(索引)。

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

我做错了什么?我如何才能让URL按我的意愿工作?谢谢

编辑:这里有个问题在我看来,这样做:

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

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

在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}Kindahacky,但有了这个bug,它将调度一个未找到的操作,您可以将其背上