CakePHP自定义路由调用错误操作

时间:2012-08-06 23:34:42

标签: cakephp routes

我在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是否我是否有一个slu。。

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

编辑:我刚检查过,似乎当我没有提供slug时,整个事情都发生了变化。 c被忽略,details成为控制者,123成为行动。

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

当正确的时候,如果我提供了一个slug,那就是我得到的:

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

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

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

1 个答案:

答案 0 :(得分: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'))
);