我有一个控制器,可以通过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"。
但是,如果有人现在需要这个功能,以下是修复它的方法:
- 与其将路由设为
/test[/:action][/:id]
,不如将其设为/test[/:action[/:id]]
,然后url助手将添加/index/,至少它可以工作 - 制作一条新的路由,在该路由中,除了其他路由外,您只收听
/test[/:id]
- 在您的控制器中,执行
public function notFoundAction() { $view = new ViewModel($this->indexAction()); //etc}
Kindahacky,但有了这个bug,它将调度一个未找到的操作,您可以将其背上