如何在Yii的urlManager中处理guid或uuid类型的主键,而不仅仅是数字类型?

时间:2013-03-30 17:02:45

标签: yii primary-key guid uuid

我正在试图弄清楚如何将HTTP GET方法中的guid类型主键值传递给控制器​​。 我已经更改了我的urlManager,如下所示:

'urlManager'=>array(
        'urlFormat'=>'path',
        'rules'=>array(
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<id:^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$>'=>'<controller>/view',
            '<controller:\w+>/<action:[a-zA-Z_]+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:[a-zA-Z_]+>/<id:^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$>'=>'<controller>/<action>',
            '<controller:\w+>/<action:[a-zA-Z_]+>'=>'<controller>/<action>',
        ),
    ),

当我浏览时

http://localhost/mywebapp/index.php/account/2BE9515F-F388-4974-BCBB-C485C58BDF7A

,结果仍然没有找到HTTP 404。

但是当我浏览时

http://localhost/mywebapp/index.php/account/index

,它工作正常。 那有什么问题?

2 个答案:

答案 0 :(得分:1)

第一个匹配规则获胜。在您的情况下,网址规则'<controller:\w+>/<id:\d+>'可能与/account/2BE9515F-F388-4974-BCBB-C485C58BDF7A匹配(<controller> = account<id> = 2)。您应该将第二条规则移到顶部。

经验法则:应在更一般的规则之前列出更具体的URL规则。

答案 1 :(得分:1)

谢谢agian,迈克尔! 我找到了问题所在!正则表达式无法正常匹配。 所以我改变如下,它工作正常:

'urlManager'=>array(
        'urlFormat'=>'path',
        'rules'=>array(
            '<controller:\w+>/<id:[({]?(0x)?[0-9a-fA-F]{8}([-,]?(0x)?[0-9a-fA-F]{4}){2}((-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})|(,\{0x[0-9a-fA-F]{2}(,0x[0-9a-fA-F]{2}){7}\}))[)}]?>'=>'<controller>/view',
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:[a-zA-Z_]+>/<id:[({]?(0x)?[0-9a-fA-F]{8}([-,]?(0x)?[0-9a-fA-F]{4}){2}((-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})|(,\{0x[0-9a-fA-F]{2}(,0x[0-9a-fA-F]{2}){7}\}))[)}]?>'=>'<controller>/<action>',
            '<controller:\w+>/<action:[a-zA-Z_]+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:[a-zA-Z_]+>'=>'<controller>/<action>',
        ),
    ),

谢谢!