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 中设置视图插件的最佳方法是啥?