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

Posted

技术标签:

【中文标题】Zend Framework 2 中的路由,跳过 url 中的“索引”操作但获取 id【英文标题】:Routing in Zend Framework 2, skip 'index' action in url but get id 【发布时间】:2012-07-18 08:12:31 【问题描述】:

我有一个控制器,可以使用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,因为它与操作的正则表达式不匹配,并且两者都是可选的。而且由于它不匹配一个动作,所以应该使用默认值(索引)。

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

我做错了什么,如何让网址按我的意愿工作? 谢谢。

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

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

实际上以xml/coverage/1 的形式给出了一个URL,它会崩溃! 将路由更改为/xml/coverage[/:action[/:id]] 至少会使 url helper 产生工作 url..

【问题讨论】:

那个应该真的可以工作,我在段路由中测试了生成的正则表达式,匹配成功。您是否在 freenode 上的 #zftalk.2 IRC 频道上调查此问题? @DASPRiD 我现在在那儿。那里也有人建议创建一条新路线,例如 /xml/coverage/[:id]。这是一个很好的建议。但是,我想知道为什么这对我不起作用,而对你起作用。 【参考方案1】:

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

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

但是,如果有人现在需要此功能才能正常工作,以下是修复它的方法:

    而不是将路由设置为/test[/:action][/:id] 将其设置为/test[/:action[/:id]],然后 url 助手将添加 /index/ 并且至少它可以工作。 创建一条新路由,让您只监听/test[/:id] 以及另一个路由。 在您的控制器中,执行 public function notFoundAction() $view = new ViewModel($this->indexAction()); //etc 有点骇人听闻,但有了这个错误,它会发送一个未找到的操作,您可以捎带它。

【讨论】:

以上是关于Zend Framework 2 中的路由,跳过 url 中的“索引”操作但获取 id的主要内容,如果未能解决你的问题,请参考以下文章

如何在Zend Framework 2中访问路由,发布,获取等参数

在 Zend Framework 2 中设置视图插件的最佳方法是啥?

通用页面的 Zend Framework 路由?

Zend Framework:从路由获取子域参数

存储过程zend framework 2.2 tablegateway中的多选问题

Zend Framework 2 中的数据库访问