1

我有以下代码routes.php

Router::connect('/c/details/:id/:slug',
    array('controller' => 'cars'),
    array('pass' => array('id', 'slug'))
);

如果我尝试访问http://domain.com/c/details/123/abc,它可以工作。但是,如果我删除abc(即 slug),CakePHP 会尝试访问操作123(这是 id,而不是操作)。

Error: The action 123 is not defined in controller CarsController

如果我使用/c/details/:id/:slug/:action/*,这是我从 1.2(是的,很旧)升级到 2.2.1 之前所拥有的,并且它工作正常,CakePHP 也会尝试访问操作123,无论我是否有 slug。

没有 slug 的 URL 在升级 CakePHP 之前总是有效的,并且使用我在控制器中的代码,如果 URL 中没有 slug,它将重定向到正确的 URL。

编辑:我刚刚检查了一下,似乎当我不提供蛞蝓时,整个事情都发生了变化。c被忽略,details成为控制器并123成为动作。

[request] => CakeRequest Object
    (
        [params] => Array
            (
                [plugin] => 
                [controller] => details
                [action] => 123
                [named] => Array()
                [pass] => Array()
                [isAjax] => 
            )

什么时候是正确的,如果我提供一个蛞蝓,这就是我得到的:

[request] => CakeRequest Object
    (
        [params] => Array
            (
                [plugin] => 
                [controller] => cars
                [action] => index
                [named] => Array()
                [pass] => Array
                    (
                        [0] => 123
                        [1] => abc
                    )

                [id] => 123
                [slug] => abc
                [isAjax] => 
            )

知道现在可能导致此问题的原因是什么吗?

4

1 回答 1

2

如果您希望 slug 是可选的(不确定),您可能需要 2 条路线。在任何情况下,action也将密钥添加到每个路由。

Router::connect('/c/details/:id',
    array('controller' => 'cars', 'action' => 'details'),
    array('pass' => array('id'))
);

Router::connect('/c/details/:id/:slug',
    array('controller' => 'cars', 'action' => 'details'),
    array('pass' => array('id', 'slug'))
);
于 2012-08-07T05:15:55.307 回答