自定义URL规则,包含Yii2中的模块

时间:2014-12-10 14:00:37

标签: php url-routing yii2

我一直在环顾四周但却找不到我需要的东西。基本上,我有一些只有DefaultController的小模块和一些带有多个控制器的大模块。 我对小模块的规则工作正常,但大模块的规则不会。这是我的规则:

'<module:\w+>/<action:\w+>' => '<module>/default/<action>',
'<module:\w+>/<action:\w+>/<id:\d+>' => '<module>/default/<action>',
'<module:\w+>/<controller:\w+>' => '<module>/<controller>/index',
'<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>'

前两个规则正常,允许我访问: http://host/news/create以及news/default/create的路由。

最后两个应该执行以下操作: http://host/posts/category应路由到posts/category/indexhttp://host/posts/category/create应路由到posts/category/create

可悲的是,它们似乎不起作用。有什么建议吗?

1 个答案:

答案 0 :(得分:5)

看起来第一条规则将捕获任何可能与第三条规则相匹配的请求。

在代表正则表达式的术语中考虑它:w+/w+:作为Yii中路由的通用规则,更多的规范性规则应该在顶部而不是更通用,所有规则应该在底部

现在,获得所需内容的最佳方法是按照以下方式执行以下操作:

'<module:news>/<action:\w+>' => '<module>/default/<action>',
'<module:news>/<action:\w+>/<id:\d+>' => '<module>/default/<action>',
'<module:posts>/<controller:\w+>' => '<module>/<controller>/index',
'<module:posts>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>'

通过这种方式,您可以清晰,直接地明确表达每个模块的路线,这也将为您提供长期的帮助。