【问题标题】:Custom URL rules with modules in Yii2Yii2 中带有模块的自定义 URL 规则
【发布时间】:2015-02-08 18:15:15
【问题描述】:

我一直在四处寻找,但没有找到我需要的东西。基本上,我有一些只有 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

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

【问题讨论】:

    标签: php url-routing yii2


    【解决方案1】:

    看起来第一个规则将捕获任何可以匹配第三个规则的请求。

    从它的代表正则表达式的角度来考虑它: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>'
    

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

    【讨论】:

    • 这最终不会产生大量的规则列表吗?或者有没有办法将多个模块添加到单个规则中?
    • 理想情况下是的,但这取决于具体情况。在这种情况下,前两个“默认”可能是任何模块的特定规则,但您需要确保所有模块都具有通用结构并正确响应该查询。其次,这是一个架构问题,而不是其他任何问题:通过制定两条响应w+/w+ 的规则,您正在创建路由冲突,其中第一个优先,因此需要区分。您可以通过以下方式在同一规则中聚合多个模块:&lt;module:(posts|otherModule)&gt;/&lt;controller:\w+&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多